确定HttpWebRequest发出的总请求,包括重定向

Tro*_*unt 3 .net redirect httpwebrequest

我想以编程方式为资源构建HttpWebRequest,而不仅仅是获取HttpWebResponse,还要确定成功返回响应的HTTP请求总数.

例如,如果我请求http://americanexpress.com,我将在最终回复之前重定向3次:

美国运通重定向

在此示例中,总共有4个请求.默认情况下,HttpWebRequest将AllowAutoRedirect设置为true,因此任何导致重定向的响应(例如HTTP 301)都将自动发出另一个请求.这很好,我只想知道发出了多少请求.

有没有办法做到这一点,没有将AllowAutoRedirect设置为false并通过重建请求手动响应重定向?

Han*_*ans 5

您可以通过将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();
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我刚刚意识到在HttpWebRequest类上有一个名为MaximumAutomaticRedirections的属性.因此,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);
Run Code Online (Sandbox Code Playgroud)

结束编辑

希望这可以帮助.