web-dev-qa-db-fra.com

En utilisant HttpClient, comment pourrais-je empêcher la redirection automatique et obtenir le code d'état d'origine et l'URL de transfert dans le cas de 301

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?

34
Gga

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.

59
Gga