我相信您的答案在于ServicePoint.BindIPEndPointDelegate
您可以在HttpWebRequest
实例中设置的属性。引用 MSDN:
一些负载平衡技术要求客户端使用特定的本地 IP 地址和端口号,而不是IPAddress.Any
(或
IPAddress.IPv6Any
对于 Internet 协议版本 6)和临时端口。你BindIPEndPointDelegate
可以满足这个要求。
基本上,BindIPEndPointDelegate
允许您选择用于连接的本地端点。您可以使用 检索所有本地 IP 地址的列表Dns.GetHostAddresses(Dns.GetHostName())
,然后在委托中随机选择一个。但是,您需要小心匹配地址族:如果远程端点是 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();
参考:
编辑:我并不是建议您实际上应该为您的项目随机选择本地地址;上面的代码只是我能想到的最简单的演示。如果您正在建立多个并发连接并希望在所有可用适配器之间最大化负载平衡,那么您应该循环访问您的本地地址;这将确保所有适配器都处理大致相等数量的连接。