使用HttpClient,在301的情况下如何防止自动重定向并获取原始状态码和转发Url [重复]
Posted
技术标签:
【中文标题】使用HttpClient,在301的情况下如何防止自动重定向并获取原始状态码和转发Url [重复]【英文标题】:Using HttpClient, how would I prevent automatic redirects and get original status code and forwading Url in the case of 301 [duplicate] 【发布时间】:2013-02-06 14:55:07 【问题描述】:我有以下方法返回给定Url
的Http status code
:
public static async void makeRequest(int row, string url)
string result;
Stopwatch sw = new Stopwatch(); sw.Start();
try
using (HttpClient client = new HttpClient())
HttpResponseMessage response = new HttpResponseMessage();
response = await client.GetAsync(url);
// dump contents of header
Console.WriteLine(response.Headers.ToString());
if (response.IsSuccessStatusCode)
result = ((int)response.StatusCode).ToString();
else
result = ((int)response.StatusCode).ToString();
catch (HttpRequestException hre)
result = "Server unreachable";
sw.Stop();
long time = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
requestComplete(row, url, result, time);
它适用于200
/404
等,但是在301
代码的情况下,我相信返回的结果是已经重定向(200
)的结果,而不是而不是应该返回的实际301
,它会有一个包含重定向指向的标头。
我在其他 .Net Web 请求类中看到了类似的内容,并且将某种 allowAutoRedirect
属性设置为 false 的技术。如果这是正确的路线,谁能告诉我HttpClient
类的正确替代方案?
This post has info on the above allowAutoRedirect concept I mean
否则,我怎样才能让这个方法返回301s
而不是200s
对于我知道是真实的网址301s
?
【问题讨论】:
怎么知道异常意味着服务器不可达? 我不知道,但这是我目前能力所允许的最佳状态。 您的能力是否允许您通过输出hre.ToString()
在某处显示异常?
哈哈,显然不是。不好喊。同时,这更像是一种包罗万象的方法,但我将进一步剖析异常并实施适当的处理。
【参考方案1】:
我发现这样做的方法是创建HttpClientHandler
的实例并将其传递给HttpClient
的构造函数
public static async void makeRequest(int row, string url)
string result;
Stopwatch sw = new Stopwatch(); sw.Start();
// added here
HttpClientHandler httpClientHandler = new HttpClientHandler();
httpClientHandler.AllowAutoRedirect = false;
try
// passed in here
using (HttpClient client = new HttpClient(httpClientHandler))
请参阅here 了解更多信息。
【讨论】:
但是将 AllowAutoRedirect 设置为 flase 意味着您必须手动处理每个 3XX 案例。没有办法只改变 301 大小写。 其实301、302、303、307都是要手动处理的。 顺便说一下,你把 HttpClient 包裹在 using 语句中,但是 HttpClientHandler 也需要被释放。 仅供参考 - 您不应为每个请求创建HttpClient
的新实例。这将导致大规模的性能问题。请参阅 Microsoft 模式和实践中的 this guidance。
@MattJohnson 该链接现在是 404。我认为这是(现在):docs.microsoft.com/en-gb/azure/architecture/antipatterns/…以上是关于使用HttpClient,在301的情况下如何防止自动重定向并获取原始状态码和转发Url [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 HttpClient 在收到 301 HTTP 状态码时不自动重定向?
HttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址
如何在不使用 SDK 的情况下使用 .NET HttpClient 上传到 Amazon S3