即使 AllowAutoRedirect = true HttpClient 也不会重定向

Posted

技术标签:

【中文标题】即使 AllowAutoRedirect = true HttpClient 也不会重定向【英文标题】:HttpClient doesn't redirect even when AllowAutoRedirect = true 【发布时间】:2017-02-23 00:59:03 【问题描述】:

我正在尝试解析 wikispaces 页面,但无法获取实际页面。我不确定它是 HttpClient 错误还是缺少配置。

这是我的代码:

HttpClientHandler handler = new HttpClientHandler();
handler.AllowAutoRedirect = true;
_httpClient = new HttpClient(handler);

HttpResponseMessage response = await _httpClient
    .GetAsync("http://medivia.wikispaces.com/Monsters");

当我运行该代码时,我得到了 StatusCode 302 并被发送到 https://session.wikispaces.com/1/auth/auth?authToken=token。我希望 HttpClient 遵循 302,因为我有 AllowAutoRedirect = true

这是我第一次遇到这个问题。它适用于邮递员和作为 RestSharp 一部分的 RestClient。

【问题讨论】:

为什么不使用WebClient 我不确定我是否理解它,但如果你不想跟随重定向,你可以简单地设置handler.AllowAutoRedirect = false; @LeiYang 因为WebClient老了,太可怕了,需要死在一个令人讨厌的痛苦中! 为什么老了?你的意思是 .net 框架版本? @LeiYang ***.com/questions/20530152/… 【参考方案1】:

HttpClient 未正确重定向的原因是该站点将您重定向到 HTTPS,然后再返回到 HTTP。一个快速的解决方法是改为 GET https://medivia.wikispaces.com/Monsters,无论如何这是一个更好的主意:

HttpResponseMessage response = await _httpClient.GetAsync("https://medivia.wikispaces.com/Monsters");
// Works fine! :)

我很好奇为什么第一种方式不起作用,所以我挖得更深一些。如果您在浏览器或网络客户端中查看网络跟踪,会发生以下情况:

GET http://medivia.wikispaces.com/Monsters
302 https://session.wikispaces.com/1/auth/auth?authToken=token
302 http://medivia.wikispaces.com/Monsters?redirectToken=token

从加密 (HTTPS) 连接到未加密连接的 302 导致 HttpClientHandler 自动停止跟踪。据我所知,这是Windows implementation of HttpClientHandler 的安全怪癖,因为在我的非正式测试中,Unix one 似乎并不关心 HTTPS->HTTP 重定向。

【讨论】:

也帮助了我,很好的发现! 有没有办法阻止这种行为?并坚持使用 http 或 https? @mjwrazor 设置HttpClientHandler.AllowAutoRedirect = false 将禁用任何重定向行为。 哇,太可怕了,这个“隐藏功能”的存在,甚至不是始终如一的跨平台。该功能可能有意义,但至少在 HttpClient 上应该有一个配置选项。【参考方案2】:

我已经尝试了很多解决 WebClient 错误 302 的选项。任何示例都可以正常工作,但此示例完美无缺。让我为社区分享我的例子。

HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync("www.google.com");

// Works fine
var resultBytes = response.Content.ReadAsByteArrayAsync().Result;

var writer = new BinaryWriter(new FileStream(strFilePath, 
FileMode.CreateNew, FileAccess.Write));
writer.Write(resultBytes);
writer.Close();

【讨论】:

虽然您的答案可能是“WebClient 上出现 302 错误的问题”的解决方案,但该线程的问题已经在使用 HttpClient

以上是关于即使 AllowAutoRedirect = true HttpClient 也不会重定向的主要内容,如果未能解决你的问题,请参考以下文章

使用套接字时的 AllowAutoRedirect 功能

在自定义 HttpClientHandler 中设置 allowautoredirect=false

C#使用HttpClient获取Location

xcode 4.4.1 c++11 头文件仍归档在 tr1 下吗?

Android运行时权限即使没有权限也会通过

http请求端口占用异常