我想以编程方式为资源构建HttpWebRequest,而不仅仅是获取HttpWebResponse,还要确定成功返回响应的HTTP请求总数。
例如,如果我提出http://americanexpress.com请求,我将在最终回复之前重定向3次:
在此示例中,总共发出了4个请求。默认情况下,HttpWebRequest将AllowAutoRedirect设置为true,因此任何导致重定向的响应(例如HTTP 301)都将自动发出另一个请求。这很好,我只是想知道发出了多少请求。
有没有办法做到这一点,将AllowAutoRedirect设置为false并通过重建请求手动响应重定向?
答案 0 :(得分: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();
}
修改强> 我刚刚意识到有一个名为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);
结束编辑
希望,这有帮助。