1つのホストに約50のHTTPリクエストを発行する必要があります(API呼び出し)。パフォーマンスが重要なので、HTTPキープアライブを使用したいと思います。 WebClientはこれをサポートしていますか?
私のマシンでは動作しますが、文書化されていることがわかりません。私は確かにそれがデフォルトであると期待しています。最も簡単な方法は、 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
...おそらく、接続がキープアライブモードになると、その状態が維持されると想定されるためです。
ここに記載されているように、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に設定する必要があり、これは非常に煩わしいことです。