Подтвердить что ты не робот

Используя HttpClient, как я могу предотвратить автоматические переадресации и получить исходный код состояния и форвардинг Url в случае 301

У меня есть следующий метод, который возвращает Http status code данного Url:

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);
}

Хорошо работает для 200/404 и т.д., однако в случае кодов 301 я верю, что возвращаемый результат - это результат уже перенаправленного (200), а не фактический 301, который должен быть возвращен и который будет содержать заголовок, в котором будет указана перенаправление.

Я видел что-то подобное в других классах веб-запросов .NET, а также в том, что было установлено свойство allowAutoRedirect для значения false. Если это по правильным линиям, может ли кто-нибудь сказать мне правильную альтернативу для класса HttpClient?

У этого сообщения есть информация о вышеупомянутой концепции allowAutoRedirect, я имею в виду

Иначе, как я могу заставить этот метод возвращать 301s, а не 200s для Urls, которые, как я знаю, являются подлинными 301s?

4b9b3361

Ответ 1

Я обнаружил, что способ сделать это - создать экземпляр HttpClientHandler и передать его в конструкторе 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))
        {

        }

Подробнее см. здесь.