【问题标题】:Determining total requests made by HttpWebRequest, including redirects确定 HttpWebRequest 发出的总请求,包括重定向
【发布时间】:2011-09-11 08:16:21
【问题描述】:

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

例如,如果我向http://americanexpress.com 发出请求,我将在最终响应之前被重定向 3 次:

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

除了将 AllowAutoRedirect 设置为 false 并通过重构请求手动响应重定向之外,还有什么方法可以做到这一点?

【问题讨论】:

标签: .net redirect httpwebrequest


【解决方案1】:

您可以通过将 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();
}

编辑: 我刚刚意识到有一个名为 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);

结束编辑

希望,这会有所帮助。

【讨论】:

  • 感谢您的回复,这就是我所说的“通过重构请求手动响应重定向”。看起来不容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多