2010-12-11 68 views
34

System.Net.WebClient.DownloadData()メソッドを使用すると、応答時間が不当に遅くなります。System.Net.WebClientが不当に遅い

.NETでWebClientクラスを使用してURLを取得すると、レスポンスを取得するまでに約10秒かかります。同じページがブラウザで1秒以内に取得されます。 これは0.5kB以下のサイズのデータ​​です。

この問題はPOST/GETパラメータとユーザーエージェントヘッダーが関係しているため、問題が発生する可能性があります。

.NETでデータをダウンロードする他の方法でも同じ問題が発生しているとは思っていませんが、同様の結果が得られる可能性があります。 (私はいつも.NETのWebリクエストが異常に遅いと感じていた...)

これは何が原因である可能性がありますか?

編集:私は次のメソッドを使用して、代わりにSystem.Net.HttpWebRequestを使用して、正確なことをやってみました、そして、すべての要求は、1秒未満で完了し

public static string DownloadText(string url) 
     var request = (HttpWebRequest)WebRequest.Create(url); 
     var response = (HttpWebResponse)request.GetResponse(); 

     using (var reader = new StreamReader(response.GetResponseStream())) 
     { 
      return reader.ReadToEnd(); 
     } 
} 


各要求が終了するのをSystem.Net.WebClientを使用して、この(古い)メソッドは、15-30s取りながら:

public static string DownloadText(string url) 
{ 
     var client = new WebClient(); 
     byte[] data = client.DownloadData(url); 
     return client.Encoding.GetString(data); 
} 
+0

関連性:http://stackoverflow.com/questions/4932541 –

答えて

2

は、ネットワークパケットをキャプチャし、「HTTPをフィルタリングし、ここでhttp://www.wireshark.org/

Wiresharkのダウンロード"パケット。 すぐに回答を得られるはずです。

+1

wiresharkには何も変わっていませんが、トレースプリントでは、WebClient.DownloadData()が呼び出され、GET要求がwiresharkに約10まで表示されないことがわかります-30秒後(「フリーズ」時間に依存)。 それは減速しているように見えますが、リクエスト自体ではなく、実際のGETリクエストの前に実行されたものです。 – moevi

+1

あなたのクライアントが何かのタイムアウトを待っていたようです。ほとんどの場合、DNSタイムアウトまたはNetBIOSタイムアウトを待っています。 DNSパケットとNetBIOSパケットをフィルタリングすることができます。また、送信元IPアドレスで除外することもできます。これは、クライアントがGET要求前に最後に送信したパケットが何であるかを示すはずです。おそらく、@壊れたパイプが正しいでしょう。プロキシを待っている可能性があります。 –

0

.NET Web要求については本質的に遅いものはありません。そのコードはうまくいくはずです。私は定期的にWebClientを使用し、非常に迅速に動作します。

各方向のペイロードの大きさはどれくらいですか?愚かな質問かもしれませんが、単に帯域幅の制限ですか?

IMO最も可能性の高いことは、あなたのウェブサイトがスピンダウンしていることです。あなたがURLをヒットすると、ウェブサイトは応答が遅くなります。これは、クライアントの障害ではありません。なんらかの理由でDNSが遅い場合もあります(この場合、IPを "hosts"ファイルにハードコードすることができます)。または、途中の一部のプロキシサーバーが遅いことも考えられます。

ウェブサイトがあなたのものでない場合は、非定型的な使用を検出して故意にスクレイパーを嫌うことがあります。

私はFiddler(フリーの簡単なWebインスペクタ)をつかんでタイミングを見ます。

0

どのブラウザを使ってテストしていますか?

デフォルトのIEインストールをお試しください。 System.Net.WebClientは、ローカルのIE設定、プロキシなどを使用します。おそらく、それは混乱していますか?

73

WebRequestでこの問題が発生しました。Proxy = nullを設定してみてください。デフォルトのWebクライアントによって

WebClient wc = new WebClient(); 
    wc.Proxy = null; 

は、実際の要求が送信される前に、時にはそれが5秒遅れのようになり、IEの設定から使用するものをプロキシを決定しようとしWebRequestクラス。

これは、HTTPバインディングを使用するWCFサービスを含むWebRequestを使用するすべてのクラスに適用されます。 一般では、アプリケーションの起動時にこの静的コードを使用することができます時にIEの設定([接続]タブ - LANの設定)で確認で自動プロキシ設定

WebRequest.DefaultWebProxy = null; 
+2

これをやったときに私は巨大なスピードブーストを得ました。ありがとう! – mpen

+1

2番目のケースは私の場合に大きな違いをもたらしました!これは間違いなく、これらのWebProxiesの「機能」を遅くすることです。 –

+0

同じ問題があり、これは本当に応答時間を改善しています! – gigi

0

Webクライアントは、いくつかのワークステーション上で遅くなることがあります。

0

非常に遅いWebClientダウンロードのもう1つの原因は、ダウンロード先のメディアです。 USBキーのような低速デバイスの場合、ダウンロード速度に大きな影響を与える可能性があります。私のHDDには、別のドライブから5MB/sでこのUSBにファイルをコピーすることはできますが、私のUSBキーには6MB/sでダウンロードできましたが、700kb/sしかありませんでした。 wgetは同じ動作を示します。これは、ここに報告されています

https://superuser.com/questions/413750/why-is-downloading-over-usb-so-slow

これはあなたのシナリオであれば、代替ソリューションは、最初のHDDにダウンロードし、ダウンロードが完了した後、低速メディアにファイルをコピーすることです。

関連する問題