即使 AllowAutoRedirect = true,HttpClient 也不会重定向
HttpClient doesn't redirect even when AllowAutoRedirect = true
我正在尝试解析维基空间页面,但无法获取实际页面。我不确定它是 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 的一部分的 Postman 和 RestClient 一起正常工作。
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, because the Unix one 在我的非正式测试中似乎并不关心 HTTPS->HTTP 重定向的安全怪癖。
我已经尝试了很多选项来解决 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();
我正在尝试解析维基空间页面,但无法获取实际页面。我不确定它是 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 的一部分的 Postman 和 RestClient 一起正常工作。
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, because the Unix one 在我的非正式测试中似乎并不关心 HTTPS->HTTP 重定向的安全怪癖。
我已经尝试了很多选项来解决 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();