J'ai la méthode suivante qui renvoie le Http status code
d'un Url
donné:
public static async void makeRequest(int row, string url)
{
string result;
Stopwatch sw = new Stopwatch(); sw.Start();
try
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = new HttpResponseMessage();
response = await client.GetAsync(url);
// dump contents of header
Console.WriteLine(response.Headers.ToString());
if (response.IsSuccessStatusCode)
{
result = ((int)response.StatusCode).ToString();
}
else
{
result = ((int)response.StatusCode).ToString();
}
}
}
catch (HttpRequestException hre)
{
result = "Server unreachable";
}
sw.Stop();
long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
requestComplete(row, url, result, time);
}
Cela fonctionne bien pour 200
/404
etc, cependant dans le cas de 301
codes Je crois que le résultat renvoyé est le déjà redirigé (200
) plutôt que le résultat réel 301
qui devrait être retourné et qui aurait un en-tête contenant où la redirection serait pointée.
J'ai vu quelque chose comme ça dans d'autres classes de requêtes Web .Net et la technique était de définir une sorte de propriété allowAutoRedirect
sur false. Si cela va dans le bon sens, quelqu'un peut-il me dire l'alternative correcte pour la classe HttpClient
?
Ce message contient des informations sur le concept allowAutoRedirect ci-dessus, je veux dire
Sinon, comment puis-je obtenir cette méthode pour retourner 301s
plutôt que 200s
pour les URL que je sais être authentiques 301s
?
J'ai trouvé que la façon de le faire est de créer une instance de HttpClientHandler
et de la passer dans le constructeur de HttpClient
public static async void makeRequest(int row, string url)
{
string result;
Stopwatch sw = new Stopwatch(); sw.Start();
// added here
HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.AllowAutoRedirect = false;
try
{
// passed in here
using (HttpClient client = new HttpClient(httpClientHandler))
{
}
Voir ici pour plus d'informations.