2011-01-15 27 views
20

単一のホスト(API呼び出し)に約50のHTTP要求を発行する必要があります。パフォーマンスは重要なので、私はHTTP KeepAliveを使用したいと思います。 WebClientはこれをサポートしていますか?WebClientはKeepAliveを使用しますか?

答えて

17

これは私のマシン上にありますが、にはと記載されています。私は確かにそれがデフォルトで期待しています。最も簡単な方法はWireshark(またはFiddler)を実行して、何がワイヤーに流れているのかを正確に調べることです。

たとえば、このプログラム:

GET/HTTP/1.1 
Host: www.microsoft.com  
Connection: Keep-Alive 

サブシーケンス要求はただ、次のとおりです:

GET/HTTP/1.1 
Host: www.microsoft.com 

...おそらく接続かつてので

using System; 
using System.Net; 

class Test 
{  
    static void Main() 
    { 
     WebClient client = new WebClient(); 
     for (int i = 0; i < 50; i++) 
     { 
      string text = client.DownloadString("http://www.microsoft.com"); 
      Console.WriteLine(text.Length); 
     } 
    } 
} 

が最初の要求を生成しますキープアライブモードになっていれば、それはそのままになります。

+0

私はいくつかの理由で、応答バイトが返されたときにクライアントのヘッダーがリセットされるため、UploadDataを使用するときにいくつかの奇妙な動作に気付きました。 – Oliver

+0

@Oliver:それがあなたが意味することは本当にはっきりしませんが、それがあなたの問題を引き起こしているものなら、あなたは新しい質問をしたいかもしれません。 –

+0

本当に問題ではないと思っていました。振る舞いは次のようになります。WebClientの作成 - >辞書へのヘッダーの追加 - > UploadDataの呼び出し - >ヘッダーが空になり、何らかの理由で核が壊れているようです。 – Oliver

14

ここで説明するように、WebClientはWebRequestをプライベート実装のhttp://msdn.microsoft.com/en-us/library/system.net.webclient.aspxで使用します。マイクロソフトはあなたを制御する公共財産としてそれを公開しません。

したがって、Reflectorを使用してその実装を検討すると、使用中のWebRequestオブジェクトに対してKeepAliveがどのように設定されているかがわかります。 @ Jonが指摘したように、実験ではKeepAliveがtrueに設定されていることが示されています。これは、.NET Remotingのプライベートな実装など、他のシナリオにもマッチします。

まれに、KeepAlive = trueがSocketExceptionにつながる可能性があります。反射やその他のトリックを使用してfalseに設定する必要があります。これは非常に面倒です。

+15

オーバーライドされたメソッド –

+1

でbase.GetWebRequest()を呼び出した後で、リフレクションを使用する必要はありません。継承し、GetWebRequest()をオーバーライドし、WebRequestでいくつかのプロパティを設定することができます。 –

+1

https://msdn.microsoft.com/en-us/library/system.net.webclient.getwebrebreest.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 – Ginkgo

関連する問題