Как изменить исходный IP-адрес в HttpWebRequest
Я запускаю это приложение на сервере, которому присвоено 5 IP-адресов. Я использую HttpWebRequest для получения некоторых данных с веб-сайта. Но когда я делаю соединение, я могу указать, из какого из 5 IP-адресов нужно установить соединение. Поддерживает ли HttpWebRequest это? Если это не так, я могу наследовать класс от него, чтобы изменить его поведение? Мне здесь нужны идеи.
Мой код прямо сейчас выглядит примерно так:
System.Net.WebRequest request = System.Net.WebRequest.Create(link);
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
StreamReader sr = new StreamReader(response.GetResponseStream());
return sr.ReadToEnd();
}
Ответы
Ответ 1
В соответствии с этим, нет. Возможно, вам придется отказаться от использования сокетов, где я знаю, что вы можете выбрать локальный IP-адрес.
EDIT: на самом деле, похоже, это возможно. HttpWebRequest имеет свойство ServicePoint, которое, в свою очередь, имеет BindIPEndPointDelegate, что может быть тем, что вы ищете.
Дайте мне минуту, я собираюсь поднять пример...
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com");
req.ServicePoint.BindIPEndPointDelegate = delegate(
ServicePoint servicePoint,
IPEndPoint remoteEndPoint,
int retryCount) {
if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) {
return new IPEndPoint(IPAddress.IPv6Any, 0);
} else {
return new IPEndPoint(IPAddress.Any, 0);
}
};
Console.WriteLine(req.GetResponse().ResponseUri);
В принципе, делегат должен вернуть IPEndPoint. Вы можете выбрать все, что хотите, но если он не сможет привязываться к нему, он снова вызовет делегата, вплоть до int.MAX_VALUE раз. Вот почему я включил код для обработки IPv6, поскольку IPAddress.Any - это IPv4.
Если вам не нравится IPv6, вы можете избавиться от этого. Кроме того, я оставляю фактический выбор IPAddress в качестве упражнения для читателя:)
Ответ 2
Попробуйте следующее:
System.Net.WebRequest request = System.Net.WebRequest.Create(link);
request.ConnectionGroupName = "MyNameForThisGroup";
((HttpWebRequest)request).Referer = "http://application.com";
using (System.Net.WebResponse response = request.GetResponse())
{
StreamReader sr = new StreamReader(response.GetResponseStream());
return sr.ReadToEnd();
}
Затем попробуйте установить ConnectionGroupName на что-то отдельное для каждого ip источника, который вы хотите использовать.
edit: используйте это вместе с делегатом связывания IP из вышеприведенного ответа.