【问题标题】:HttpClient GetStringAsync returns 301, but browsers are able to navigate to correct addressHttpClient GetStringAsync 返回 301,但浏览器能够导航到正确的地址
【发布时间】: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,你想让操作失败吗?如何处理异常完全取决于您

标签: c# dotnet-httpclient http-status-code-301


【解决方案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有解释

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2019-09-22
    • 2021-12-31
    • 1970-01-01
    相关资源
    最近更新 更多