2011-08-08 44 views
11

WebClientに問題があります。WebClientが非常に遅い

非常に遅いです。 1つのWebサイトからStringをダウンロードするのに約3〜5秒かかります。 私はネットワークに問題はありません。

これは私のModifed WebClientです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace StatusChecker 
{ 
    class WebClientEx: WebClient 
    { 
     public CookieContainer CookieContainer { get; private set; } 

     public WebClientEx() 
     { 
      CookieContainer = new CookieContainer(); 

      ServicePointManager.Expect100Continue = false; 
      Encoding = System.Text.Encoding.UTF8; 

      WebRequest.DefaultWebProxy = null; 
      Proxy = null; 
     } 

     public void ClearCookies() 
     { 
      CookieContainer = new CookieContainer(); 
     } 

     protected override WebRequest GetWebRequest(Uri address) 
     { 

      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = CookieContainer; 
      } 
      return request; 
     } 
    } 
} 

UPDATE: のwiresharkで、私は、単一のDownladStringは、数千のパケットを送信し、受信していることがわかりました。

+4

Webクライアントは、特に低速ではない、問題はどこか別の場所でなければなりません...おそらくあなたがダウンロードしているウェブサイトが遅いでしょうか? –

+1

WireSharkのようなトラフィックロガーを使用して、遅延が実際には単一の要求と応答フレームの間にあるかどうかを判断する必要があります(ネットワーク/サーバーのスローダウンによって引き起こされる)か、クライアントコードが不正確であり、エラー。 –

+0

また、複数のダウンロードをループで実行してプロセスを「ウォームアップ」します(たとえば、アセンブリのロードが不要になります)。 –

答えて

30

ここに手で二つの問題(私も以前、私自身のプログラムに気づいたこと)があるかもしれません:これは、デフォルトでWebRequestため発生します。

  • 最初の要求が異常に長い時間を要します最初に起動するときにプロキシ設定を検出して読み込みますが、これにはかなりの時間がかかります。これを停止するには、単にnullにプロキシプロパティ(WebRequest.Proxy)を設定し、それは(あなたが直接インターネットにアクセスすることができます提供)チェックをバイパスます
  • あなたは一度で2つの以上のアイテムをダウンロードすることができません:デフォルトでは、同時に2つのHTTP接続を開くことができます。これを変更するには、ServicePointManager.DefaultConnectionLimitを大きく設定します。私は通常これをint.MaxValueに設定します(1,000,000接続でホストに迷惑をかけないようにしてください)。
+1

これは私のケースでは正解ではありません。私はすでにプロキシをnullに設定していることがわかります。そして、私は同時に2つの項目をダウンロードしていません。 Wiresharkの私のポストにも追加されているように、私のアプリが1つのダウンロード文字列につき何千ものパケットを送信して受け取ることがわかります。文字列はgoogle.comのような単純なウェブサイトです。 – Hooch

+0

異常に遅い(接続がキープアライブをオフにして接続速度がほぼ同じであることを意味する)場合は、正常に動作しています。ハンドシェイクを実行し、要求を行い、サーバーが応答を作成するのを待ってから、応答を読み取るまでに時間がかかります。 – foxy

+0

これらのキープアライブについて少し詳しく教えてもらえますか?そしてなぜ私のアプリが何千ものパケットを送るのですか? – Hooch

0

多分それは誰かを助けるでしょう。一部のWebサービスは圧縮(gzipまたはその他)をサポートしています。したがって、あなたのリクエストにAccept-Encodingヘッダーを追加し、Webクライアントインスタンスのためにautomatic decompressionを有効にすることができます。 Chromeはそのように機能します。チェックされ、最初のプロキシ設定に関連している場合

0

は、いくつかのオプションがあります:

  1. は、Internet Explorerで自動プロキシ検出の設定を無効にし
  2. に設定nullにプロキシ:

    WebClient.Proxy = null

  3. アプリケーションの起動時にデフォルトのwebproxyをnullに設定します。

    WebRequest.DefaultWebProxy = null;

は古い.NETコードの代わりに、nullに設定するには、あなたはこれを書くために使用される(ただし、ヌルは今好ましい):

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy();