HttpClient即使AllowAutoRedirect = true也不进行重定向

18

我尝试解析一个Wikispaces页面,但是我不能获取实际页面。我不确定这是HttpClient的错误还是一些缺失的配置。

这是我的代码:

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

HttpResponseMessage response = await _httpClient
    .GetAsync("http://medivia.wikispaces.com/Monsters");
当我运行该代码时,我得到状态码302并被发送到https://session.wikispaces.com/1/auth/auth?authToken=token。我期望HttpClient会遵循302,因为我已经设置了AllowAutoRedirect = true。这是我第一次遇到这个问题。在Postman和RestSharp的RestClient中可以正常工作。

1
我不确定我是否理解了它,但如果您不想遵循重定向,您可以简单地设置handler.AllowAutoRedirect = false; - giubueno
2
@LeiYang 因为 WebClient 太老旧了,太可怕了,需要死得惨烈而痛苦! - DavidG
为什么它是旧的?你是指.NET Framework的版本吗? - Lei Yang
@LeiYang https://dev59.com/GWIj5IYBdhLWcg3wMicu - DavidG
我使用HttpClient,因为它是net core的标准库...以前从未遇到过任何问题... @giubueno 我需要重定向,但问题是HttpClient可能不能够足够多次地重定向。我甚至已将MaxRedirect设置为一个荒谬的数字,仍然无法解决问题。 - Diego
显示剩余2条评论
2个回答

20

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停止自动跟随。据我所知,这是HttpClientHandler的Windows实现的安全性问题,因为在我的非正式测试中,Unix实现似乎不关心HTTPS->HTTP重定向。


也帮助了我,不错的发现! - MOnsDaR
有没有办法停止这种行为?并让它保持在http或https之一? - mjwrazor
2
@mjwrazor 设置 HttpClientHandler.AllowAutoRedirect = false 将禁用任何重定向行为。 - Nate Barbettini
哇,这个“隐藏功能”存在太可怕了,而且甚至在不同平台上也不一致。这个功能可能有意义,但至少应该在HttpClient上提供配置选项。 - Mark Lagendijk

-1

我尝试了很多方法来解决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 - Martin Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接