2015-11-05 13 views
5

URLが有効かどうかをテストするためのC#コンソールアプリケーションを開発しています。ほとんどのURLではうまくいきます。しかし、アプリケーションがターゲットサイトから常に404応答を受け取ったが、URLが実際にブラウザで動作する場合があることがわかった。また、これらのURLは、DHC(Dev HTTP Client)などのツールで試したときにも機能します。C#HttpClient.SendAsyncは常に404を返しますが、URLはブラウザで動作します

最初は、これが正しいヘッダーを追加しない理由である可能性があります。しかし、同じヘッダーでhttp要求を作成するためにFiddlerを試した後、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ヘッダーをブロックしていない限り、どこから来ても問題ありませんが、変更することもできます。これはヘッダーのようなものです。 **あなたのブラウザから送信されたリクエストを正確に**再現していることを確認しましたか? ** HTTPトラフィックを正確に**キャプチャしてコードに複製するには、Fiddlerのようなツールを使用しましたか? – pymaxion

+0

@pymaxionはい。私はあなたがしていることをしました。私はFiddlerを使って、http reqestの成功の様子を見ています。そして、それらのヘッダーをコードに追加しました。後で似たヘッダーがあっても、それはまだ機能しませんでした。 – 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

この問題のもう1つの原因は、送信するURLが約2048バイトを超える場合です。その時点で、コンテンツ(ほぼ確実にクエリ文字列)は切り捨てられ、これはサーバー側のルートと正しく一致しない可能性があることを意味します。

これらのURLはブラウザで正しく処理されましたが、powerシェルでgetコマンドを使用しても失敗しました。

この問題は、長いクエリ文字列でGETを使用する代わりに、キー値のペアを持つPOSTを使用することで解決されました。

関連する問題