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,但浏览器能够导航到正确的地址