2017-04-23 307 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狀態代碼也是非空的。