Я полагаю, что ваш ответ лежит в свойстве ServicePoint.BindIPEndPointDelegate
, которое вы можете установить в своем экземпляре HttpWebRequest
. Цитата MSDN:
Некоторые методы балансировки нагрузки требуют от клиента использования определенного
локальный IP-адрес и номер порта, а не IPAddress.Any
(или
IPAddress.IPv6Any
для интернет-протокола версии 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();
Ссылки:
Редактировать : Я не предлагаю вам выбирать произвольные локальные адреса для вашего проекта; приведенный выше код был просто самой простой демонстрацией, которую я мог придумать. Если вы устанавливаете несколько одновременных подключений и хотите максимизировать распределение нагрузки по всем доступным адаптерам, то вам следует циклически просматривать свои локальные адреса; это гарантировало бы, что все адаптеры обрабатывают примерно одинаковое количество соединений каждое.