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

Posted

技术标签:

【中文标题】HttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址【英文标题】:HttpClient GetStringAsync returns 301, but browsers are able to navigate to correct address 【发布时间】:2019-12-28 07:48:13 【问题描述】:

我认为HttpClient 应该能够处理301 错误代码,并重定向到正确的地址。但是使用以下地址(https://www.npr.org/templates/rss/podcast.php?id=510298),它会引发异常。浏览器能够正确处理它。只是想了解是否有出路还是我错过了什么。

HttpClient client = new HttpClient();

var s = await client
    .GetStringAsync("https://www.npr.org/templates/rss/podcast.php?id=510298");

抛出

Test1 [0:00.779] Failed: System.Net.Http.HttpRequestException : Response 
status code does not indicate success: 301 (Moved Permanently).
System.Net.Http.HttpRequestException : Response status code does not 
indicate success: 301 (Moved Permanently).
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()
   at System.Net.Http.HttpClient.GetStringAsyncCore(Task`1 getTask)
   at XUnitTestProject1.UnitTest1.Test1() in 
   C:\Users\res\source\repos\test\XUnitTestProject1\UnitTest1.cs:line 13

【问题讨论】:

当你跟踪一个 url 并收到 301 错误时,你必须处理错误并进行新的调用,这就是浏览器在幕后所做的事情。 HTTP 客户端无法为您执行此操作,因为它不知道您想对错误执行什么操作,即您是否要更新保存 url 的位置,以便下一次调用直接转到新 url,你想跟随新地址的链接,你想调用一个不同的 url,你想让操作失败吗?如何处理异常完全取决于您 【参考方案1】:

我终于找到了原因。通常HttpClient 会正确处理重定向,但如果来自https -> http,它不会处理重定向。这里就是这种情况。我被 chrome 浏览器的响应难住了,chrome 中显示的重定向 url 以 https (https://www.npr.org/rss/podcast.php?id=510298) 开头,但是实际重定向到 http://www.npr.org/rss/podcast.php?id=510298

https://github.com/dotnet/runtime/issues/21446#issuecomment-298323133有解释

【讨论】:

以上是关于HttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient GetStringAsync - 它永远不会回来

HttpClient->GetStringAsync() 为 https Uris 抛出 0x000006F4

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

如何在 C# 中包装 HttpClient 以实现可测试性

Xamarin PCL 项目中的 HttpClient 访问失败

GetStringAsync 持续时间过长且永不返回