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

4

我认为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

1
当你在跟踪一个URL时,如果出现301错误,那么你必须处理该错误并进行新的调用,这就是浏览器在幕后所做的。HTTP客户端无法为您执行此操作,因为它不知道您想要如何处理该错误,例如:您是否想要更新保存URL的位置,以便下一次调用直接到达新的URL,您是否想要跟随链接到新地址,您是否想要调用其他URL,或者您是否想要失败操作。如何处理异常完全取决于您。 - MikeT
1个回答

6
我终于找到了原因。通常,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有一个解释。


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