1つのホストに約50のHTTPリクエストを発行する必要があります(API呼び出し)。パフォーマンスが重要なので、HTTPキープアライブを使用したいと思います。WebClientはこれをサポートしていますか?
2 に答える
私のマシンでは動作しますが、文書化されていることがわかりません。私は確かにそれがデフォルトであると期待します。最も簡単な方法は、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は、プライベート実装http://msdn.microsoft.com/en-us/library/system.net.webclient.aspxでWebRequestを利用します。Microsoftは、それをユーザーが制御できるパブリックプロパティとして公開していません。
したがって、Reflectorを使用してその実装を確認すると、使用中のWebRequestオブジェクトに対してKeepAliveがどのように設定されているかを確認できます。@Jonが指摘したように、実験では、KeepAliveがtrueに設定されていることが示されています。これは、.NETRemotingのプライベート実装などの他のシナリオにも一致します。
まれに、KeepAlive = trueがSocketExceptionにつながる可能性がある場合は、リフレクションまたはその他のトリックを使用してfalseに設定する必要があります。これは非常に煩わしいことです。