24

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

4

2 に答える 2

21

私のマシンでは動作しますが、文書化されていることがわかりません。私は確かにそれがデフォルトであると期待します。最も簡単な方法は、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

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

于 2011-01-15T10:16:35.113 に答える
18

ここに記載されているように、WebClientは、プライベート実装http://msdn.microsoft.com/en-us/library/system.net.webclient.aspxでWebRequestを利用します。Microsoftは、それをユーザーが制御できるパブリックプロパティとして公開していません。

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

まれに、KeepAlive = trueがSocketExceptionにつながる可能性がある場合は、リフレクションまたはその他のトリックを使用してfalseに設定する必要があります。これは非常に煩わしいことです。

于 2011-01-15T11:24:49.903 に答える