2017-04-23 305 views
2

我有2个网址:https://pcr.apple.com/id868222886https://jigsaw.w3.org/HTTP/300/302.html。两者都有位置链接和302响应代码。HttpClient 302重定向

using System; 
using System.IO; 
using System.Net.Http; 

namespace XaveScor.PodcastFeed 
{ 
    public class RemoteFeedSource: FeedSource 
    { 
     private string url; 
     protected virtual HttpMessageHandler Handler => new HttpClientHandler() { AllowAutoRedirect = true }; 

     public override Stream Stream => client.Value.GetStreamAsync(url).Result; 

     private readonly Lazy<HttpClient> client; 

     public RemoteFeedSource(string url) 
     { 
      client = new Lazy<HttpClient>(() => new HttpClient(Handler), false);  
      this.url = url; 
     } 
    } 
} 


[TestMethod] 
public void Test1() //fail 
{ 
    var source = new RemoteFeedSource("https://pcr.apple.com/id868222886"); 
    Assert.AreNotEqual(source.Stream.GetString(), ""); 
} 

[TestMethod] 
public void Test2() //success 
{ 
    var source = new RemoteFeedSource("https://jigsaw.w3.org/HTTP/300/302.html"); 
    Assert.AreNotEqual(source.Stream.GetString(), ""); 
} 

为什么?有什么区别?

+0

区别在哪里? 302 =找到(通常用于重定向),301 =永久移动。见[这里](https://developer.att.com/application-resource-optimizer/docs/best-practices/http-300-status-codes)。 – john

+0

@john我有两个相同的,我认为,链接。但是HttpClient在这个链接上的工作是不同的。我的问题是为什么。为什么行为不同? – XaveScor

回答

3

如果你看一下在响应中的头,你会看到这一点:

第一个(https://pcr.apple.com/id868222886):

Content-Length: 0 
Location: http://beardycast.libsyn.com/rss 

第二个(https://jigsaw.w3.org/HTTP/300/302.html):

Content-Length: 389 
Content-Type: text/html;charset=ISO-8859-1 
Location:  https://jigsaw.w3.org/HTTP/300/Overview.html 

所以第一台服务器默默地重定向你,第二台服务器为你提供了一些额外的标题:

Strict-Transport-Security: max-age=15552015; includeSubDomains; preload 
Public-Key-Pins: pin-sha256="cN0QSpPIkuwpT6iP2YjEo1bEwGpH/yiUn6yhdy+HNto="; pin-sha256="WGJkyYjx1QMdMe0UqlyOKXtydPDVrk7sl2fV+nNm1r4="; pin-sha256="LrKdTxZLRTvyHM4/atX2nquX9BeHRZMCxg3cf4rhc2I="; max-age=864000 
X-Frame-Options: deny 
X-XSS-Protection: 1; mode=block 

和响应体:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
       "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<title>Moved</title> 
</head> 
<body> 
<P>This resources has moved, click on the link if your browser doesn't support automatic redirection<BR> 
<A HREF="http://jigsaw.w3.org/HTTP/300/Overview.html">http://jigsaw.w3.org/HTTP/300/Overview.html</A></body> 
</html> 

这就是为什么HttpClient返回非空的结果字符串 - 这不是真的空。你的单元测试有错误的设计方法,因为它们不检查状态,但是只检查响应长度,即使对于http状态代码也是非空的。