如何配置 HttpClient 在收到 301 HTTP 状态码时不自动重定向?

Posted

技术标签:

【中文标题】如何配置 HttpClient 在收到 301 HTTP 状态码时不自动重定向?【英文标题】:How does one configure HttpClient not to automatically redirect when it receives a 301 HTTP Status Code? 【发布时间】:2012-05-17 19:47:59 【问题描述】:

考虑一个重定向的 ASP.NET Web API 服务

public class ThisController : ApiController

    /* more methods */

    public override HttpResponseMessage Post()
    
        var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently);
        // Post requests should be made to "ThatController" instead.
        string uri = Url.Route("That", null);
        result.Headers.Location = new Uri(uri, UriKind.Relative);
        return result;
    

尝试验证 POST 数据到“api/this”是否会将您重定向到“api/that”,我有以下测试方法:

[TestMethod]
public void PostRedirects()

    using (var client = CreateHttpClient("application/json"))
    
        var content = CreateContent(expected, "application/json");
        using (var responseMessage = client.PostAsync("api/this", content).Result)
        
            Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode);
            Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location);
        
    


protected HttpClient CreateHttpClient(string mediaType)

    var client = new HttpClient();
    client.BaseAddress = new Uri("http://api.example.com/");
    MediaTypeWithQualityHeaderValue headerValue = MediaTypeWithQualityHeaderValue.Parse(mediaType);
    client.DefaultRequestHeaders.Accept.Add(headerValue);
    client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("gzip"));
    client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("deflate"));
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(new ProductHeaderValue("MyProduct", "1.0")));
    client.MaxResponseContentBufferSize = 1024*1024*8;
    return client;


protected ObjectContent CreateContent(T model, string mediaType)

    var requestMessage = new HttpRequestMessage();
    MediaTypeFormatter mediaTypeFormatter = null;
    switch (mediaType)
    
        case "application/json":
            mediaTypeFormatter = new JsonMediaTypeFormatter();
            break;

        case "application/xml":
        case "text/xml":
            mediaTypeFormatter = new XmlMediaTypeFormatter();
            break;

        default:
            Assert.Fail();
            break;
    

    return requestMessage.CreateContent(
        model,
        new[]  mediaTypeFormatter ,
        new FormatterSelector());

真正发生的情况是 HTTP 状态代码被发送到带有正确 Location 标头的客户端,然后 HttpClient 自动对该 URI 执行 GET。结果,我的测试从未通过。

如何将 HttpClient 配置为在收到 301 时不自动重定向,以便我可以验证我的服务器响应?

【问题讨论】:

How can I get System.Net.Http.HttpClient to not follow 302 redirects?的可能重复 【参考方案1】:

试试:

var handler = new HttpClientHandler() 

    AllowAutoRedirect = false
;

HttpClient client = new HttpClient(handler);

【讨论】:

是否可以在不需要两个单独的HttpClient 实例的情况下针对每个请求执行此操作(即一个允许重定向,一个不允许重定向)? 也许你需要这个:handler.MaxAutomaticRedirections = 1 @Dai 不,不幸的是,如果不重新发明***,这是不可能的。但如果你不介意使用第三方库that's exactly what I did in Flurl 3.0。 差不多十年后...你如何为使用TestServer.CreateClient() 创建的干净设置这个??

以上是关于如何配置 HttpClient 在收到 301 HTTP 状态码时不自动重定向?的主要内容,如果未能解决你的问题,请参考以下文章

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

HttpClient 忽略 AllowAutoRedirect 指令

在 weer.nl 网站上使用 telnet get 请求时 - 我收到无法修复的 301 错误

如何在 web.config 中配置 301 永久重定向?

尽管配置了正确的 CORS 标头,但 301 响应“跨源请求被阻止”

如何找到 301/302 重定向源?