使用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 【问题描述】:

我有以下方法返回给定UrlHttp 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 状态码时不自动重定向?

如何防止 301 重定向中的附加参数

HttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址

如何在不使用 SDK 的情况下使用 .NET HttpClient 上传到 Amazon S3

如何在没有斜杠的情况下访问目录的 index.php 并且不获得 301 重定向

301重定向后如何防止chrome从磁盘缓存中加载index.html