あなたの答えは、インスタンスServicePoint.BindIPEndPointDelegate
内で設定できるプロパティにあると思います。HttpWebRequest
MSDNを引用:
一部の負荷分散技術では、クライアントが特定のローカル IP アドレスとポート番号を使用する必要があります。これは、IPAddress.Any
(または
IPAddress.IPv6Any
インターネット プロトコル バージョン 6 の場合) および一時的なポートではありません。この要件BindIPEndPointDelegate
を満たすことができます。
基本的に、BindIPEndPointDelegate
接続に使用するローカル エンドポイントを選択できます。を使用してすべてのローカル IP アドレスのリストを取得しDns.GetHostAddresses(Dns.GetHostName())
、デリゲート内でランダムに 1 つを選択できます。ただし、アドレス ファミリを一致させるように注意する必要があります。リモート エンドポイントが IPv6 の場合は、ローカル IPv6 アドレスを選択する必要があります。
以下にいくつかのサンプルコードを含めます。
Uri uri = new Uri("http://google.com");
Random random = new Random();
IPAddress[] localAddresses = Dns.GetHostAddresses(Dns.GetHostName());
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ServicePoint.BindIPEndPointDelegate =
(servicePoint, remoteEndPoint, retryCount) =>
{
var allowedLocalAddresses =
localAddresses.Where(localAddress =>
localAddress.AddressFamily == remoteEndPoint.AddressFamily).ToArray();
IPAddress selectedLocalAddress =
allowedLocalAddresses[random.Next(allowedLocalAddresses.Length)];
return new IPEndPoint(selectedLocalAddress, 0);
};
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
参考文献:
編集: プロジェクトのローカル アドレスを実際に無作為に選択する必要があることを示唆しているわけではありません。上記のコードは、私が考えることができる最も単純なデモにすぎません。多数の同時接続を確立していて、利用可能なすべてのアダプタ間で負荷分散を最大化したい場合は、ローカル アドレスを循環する必要があります。これにより、すべてのアダプタがそれぞれほぼ同じ数の接続を処理することが保証されます。