2015-11-05 173 views
5

我正在開發一個C#控制檯應用程序來測試URL是否有效。它適用於大多數網址。但是我們發現在某些情況下,應用程序總是從目標站點獲得404響應,但實際上URL在瀏覽器中正常工作。當我在諸如DHC(開發HTTP客戶端)等工具中嘗試使用這些URL時,這些URL也起作用。C#HttpClient.SendAsync總是返回404,但URL在瀏覽器中工作

在開始,我雖然這可能是不添加正確的標題的原因。但在嘗試使用Fiddler編寫具有相同頭文件的http請求之後,它在Fiddler中起作用。

那麼,我的代碼有什麼問題? .NET HttpClient有沒有錯誤?

這裏是我的測試應用程序的簡化代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var urlTester = new UrlTester("http://www.hffa.it/short-master-programs/fashion-photography"); 

     Console.WriteLine("Test is started"); 

     Task.WhenAll(urlTester.RunTestAsync()); 

     Console.WriteLine("Test is stoped"); 
     Console.ReadKey(); 
    } 


    public class UrlTester 
    { 
     private HttpClient _httpClient; 
     private string _url; 

     public UrlTester(string url) 
     { 
      _httpClient = new HttpClient 
      { 
       Timeout = TimeSpan.FromMinutes(1) 
      }; 

      // Add headers 
      _httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"); 
      _httpClient.DefaultRequestHeaders.Add("Accept-Encoding", "gzip,deflate,sdch"); 
      _httpClient.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
      _httpClient.DefaultRequestHeaders.Add("Accept-Language", "sv-SE,sv;q=0.8,en-US;q=0.6,en;q=0.4"); 

      _url = url; 
     } 

     public async Task RunTestAsync() 
     { 
      var httpRequestMsg = new HttpRequestMessage(HttpMethod.Get, _url); 

      try 
      { 
       using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead)) 
       { 
        Console.WriteLine("Response: {0}", response.StatusCode); 
       } 
      } 
      catch (HttpRequestException e) 
      { 
       Console.WriteLine(e.InnerException.Message); 
      } 
     } 
    } 

} 
+0

什麼*確切*是你從代碼中得到的輸出? –

+0

HTTP請求是一個HTTP請求;它來自哪裏並不重要(除非服務器阻塞了某些User-Agent頭,但即使這樣做可以更改)。這_does_聽起來像一個頭問題給我。你是否確實**重現了瀏覽器發送的請求?您是否使用過像Fiddler這樣的工具來準確捕獲HTTP流量,然後將其複製到您的代碼中? – pymaxion

+0

@pymaxion是的。我做你喜歡的事。我使用Fiddler來查看標題在成功的http請求中的樣子。然後在代碼中添加這些標頭。即使我以後得到類似的標題,它仍然無法工作。 – raycode

回答

6

這似乎是一個問題所接受的語言。我使用以下Accept-Language頭值

_httpClient.DefaultRequestHeaders.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6,ru;q=0.4"); 

enter image description here

P.S.時得到了200響應我假設你知道你的例子_client應該在urlTester構造函數中讀取_httpClient或者它不會生成。

+1

非常感謝。它適用於您的解決方案。似乎將英語添加到「Accept-Language」將適用於所有情況。 – raycode

0

這個問題的另一個可能的原因是如果你發送的網址超過約2048字節長。此時內容(幾乎可以肯定是查詢字符串)可能會被截斷,這又意味着它可能無法與服務器端路由正確匹配。

雖然這些url在瀏覽器中正確處理,但它們在使用power shell中的get命令時也失敗了。

此問題已通過使用帶有鍵值對的POST而不是使用具有長查詢字符串的GET來解決。

相關問題