HTTP を使用してデータ リソースに接続するアプリケーションは、.NET Framework の ServicePoint クラスと ServicePointManager クラスを使用して、インターネットへの接続を管理し、最適なスケールとパフォーマンスが達成されるようにします。
ServicePoint クラスには、アプリケーションがインターネット リソースにアクセスするために接続できるエンドポイントが用意されています。各 ServicePoint には、各接続で最適化の情報を共有してパフォーマンスを向上させることによって、インターネット サーバーとの最適な接続を確立するために役立つ情報が含まれます。
各 ServicePoint は、URI (Uniform Resource Identifier) によって識別され、URI のスキーム識別子とホスト フラグメントに従って分類されます。たとえば、https://www.contoso.com/index.htm と https://www.contoso.com/news.htm?date=today という 2 つの URI への要求は、同じ ServicePoint のインスタンスによって提供されます。これは、どちらの URI もスキーム識別子 (http) とホスト フラグメント (www.contoso.com) が同じであるためです。アプリケーションがサーバー www.contoso.com との永続的な接続を既に確立している場合、アプリケーションはこの接続を使用して両方の要求を取得するため、2 つの接続を作成する必要がありません。
ServicePointManager は、ServicePoint インスタンスの作成と破棄を管理する静的なクラスです。ServicePointManager は、既存の ServicePoint インスタンスのコレクションにないインターネット リソースをアプリケーションが要求したときに、ServicePoint を作成します。ServicePoint インスタンスは、インスタンスの最大待ち時間を超えたとき、または既存の ServicePoint インスタンスの数がアプリケーションの ServicePoint インスタンスの最大数を超えたときに破棄されます。最大待ち時間の既定値と ServicePoint インスタンスの最大数の既定値は、ServicePointManager で MaxServicePointIdleTime プロパティと MaxServicePoints プロパティを設定することで制御できます。
クライアントとサーバーの間の接続数は、アプリケーションのスループットに大きく影響します。HttpWebRequest クラスを使用するアプリケーションは、既定では 1 つのサーバーとの永続的な接続を最大で 2 つ使用しますが、接続の最大数はアプリケーションごとに設定できます。
![]() |
---|
HTTP/1.1 仕様では、アプリケーションからの接続数が 1 つのサーバーにつき 2 つに制限されます。 |
最適な接続数は、アプリケーションが動作する実際の条件によって異なります。アプリケーションが使用できる接続数を増やしても、アプリケーションのパフォーマンスに影響しない場合もあります。接続数の増加が与える影響を判断するには、接続数を変えながらパフォーマンス テストを実行します。アプリケーションが使用する接続数を変更するには、次のコード例に示すように、アプリケーションの初期化時に ServicePointManager クラスの静的な DefaultConnectionLimit プロパティを変更します。
// Set the maximum number of connections per server to 4.
ServicePointManager.DefaultConnectionLimit = 4;
' Set the maximum number of connections per server to 4.
ServicePointManager.DefaultConnectionLimit = 4
ServicePointManager.DefaultConnectionLimit プロパティを変更しても、以前に初期化された ServicePoint インスタンスには影響しません。次のコードでは、サーバー https://www.contoso.com の既存の ServicePoint の最大接続数を newLimit
に格納されている値に変更します。
Uri uri = new Uri("https://www.contoso.com/");
ServicePoint sp = ServicePointManager.FindServicePoint(uri);
sp.ConnectionLimit = newLimit;
Dim uri As New Uri("https://www.contoso.com/")
Dim sp As ServicePoint = ServicePointManager.FindServicePoint(uri)
sp.ConnectionLimit = newLimit