Определение общего количества запросов, сделанных HttpWebRequest, включая перенаправления - PullRequest
3 голосов
/ 11 сентября 2011

Я хочу программно создать HttpWebRequest для ресурса и не только получить HttpWebResponse, но и определить общее количество HTTP-запросов, выполненных для успешного возврата ответа.

Например, если я сделаю запросдля http://americanexpress.com Перед окончательным ответом я буду перенаправлен 3 раза:

American Express redirects

В этом примере всего делается 4 запроса.По умолчанию HttpWebRequest устанавливает для параметра AllowAutoRedirect значение true, поэтому любой ответ, вызывающий перенаправление, например HTTP 301, автоматически отправляет другой запрос.Это нормально, я просто хочу узнать , сколько запросов было выдано.

Можно ли как-нибудь обойтись без установки в AllowAutoRedirect значения false и ручного ответа на перенаправление путем восстановления запросов?

1 Ответ

5 голосов
/ 11 сентября 2011

Этого можно добиться, установив для AllowAutoRedirect значение false и ответив на коды состояния перенаправления HTTP. Полный список кодов состояния HTTP см. W3C . Вот небольшой пример кода (детали обработки ошибок опущены):

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://americanexpress.com");
webRequest.AllowAutoRedirect = false;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

int redirCount = 0;
while (webResponse.StatusCode == HttpStatusCode.TemporaryRedirect ||
       webResponse.StatusCode == HttpStatusCode.MovedPermanently ||             
       webResponse.StatusCode == HttpStatusCode.MultipleChoices ||
       webResponse.StatusCode == HttpStatusCode.Found ||
       webResponse.StatusCode == HttpStatusCode.SeeOther)
{
    string location = webResponse.Headers["Location"];

    redirCount++;
    Console.Out.WriteLine("Redirection location: {0}", location);

    webRequest = (HttpWebRequest)WebRequest.Create(location);
    webRequest.AllowAutoRedirect = false;

    webResponse = (HttpWebResponse)webRequest.GetResponse();
}

EDIT: Я только что понял, что есть свойство MaximumAutomaticRedirections на Класс HttpWebRequest. Итак, класс HttpWebRequest должен посчитать количество перенаправления для обработки максимально разрешенных перенаправлений. Я отладил в исходный код класса HttpWebRequest и обнаружил приватное поле с именем _AutoRedirections который считает количество перенаправлений.

Итак, чтобы получить количество перенаправлений, было бы гораздо более простое решение:

public class HttpWebRequestAdapter
{
  private readonly HttpWebRequest _request;
  public HttpWebRequestAdapter(HttpWebRequest request)
  {
    _request = request;
  }

  public int NumberOfRedirects
  {
    get 
    {
      FieldInfo fi = _request.GetType().GetField("_AutoRedirects", BindingFlags.NonPublic | BindingFlags.Instance);

      return (int)fi.GetValue(_request);
    }
  }
}

 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://americanexpress.com");

  webRequest.AllowAutoRedirect = true;
  webRequest.MaximumAutomaticRedirections = 10;

  HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();


  HttpWebRequestAdapter adapter = new HttpWebRequestAdapter(webRequest);

  Console.Out.WriteLine(adapter.NumberOfRedirects);

КОНЕЦ РЕДАКТИРОВАНИЯ

Надеюсь, это поможет.

...