如何配置 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 错误