web-dev-qa-db-ja.com

WebClientはKeepAliveを使用しますか?

1つのホストに約50のHTTPリクエストを発行する必要があります(API呼び出し)。パフォーマンスが重要なので、HTTPキープアライブを使用したいと思います。 WebClientはこれをサポートしていますか?

24
Vilx-

私のマシンでは動作しますが、文書化されていることがわかりません。私は確かにそれがデフォルトであると期待しています。最も簡単な方法は、 Wireshark (またはFiddler)を実行して、何が起こっているのかを正確に確認することです。

たとえば、次のプログラムは次のとおりです。

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);
        }
    }
}

次の最初のリクエストを生成します。

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

サブシーケンスリクエストは次のとおりです。

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

...おそらく、接続がキープアライブモードになると、その状態が維持されると想定されるためです。

21
Jon Skeet

ここに記載されているように、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に設定する必要があり、これは非常に煩わしいことです。

18
Lex Li