gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:55:52 25 4
gpt4 key购买 nike

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

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

American Express redirects

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

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

最佳答案

您可以通过将 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 的私有(private)字段它计算重定向的次数。

因此,要获得重定向次数,一个更简单的解决方案是:

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

结束编辑

希望这对您有所帮助。

关于.net - 确定 HttpWebRequest 发出的总请求,包括重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com