как изменить исходный IP-адрес в HttpWebRequest

Я запускаю это приложение на сервере, который назначил 5 IPs. Я использую HttpWebRequest для получения некоторых данных с веб-сайта. Но когда я делаю соединение, я могу указать, из какого из 5 IPs сделать соединение. Класса 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();
}

2 ответов


по данным этой, нет. Возможно, вам придется перейти к использованию сокетов, где я знаю, что вы можете выбрать локальный 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.Массив времена. Вот почему я включил код для обработки IPv6, начиная с IPAddress.Любой на IPv4.

Если вы не заботитесь о IPv6, вы можете избавиться от этого. Кроме того, я оставляю фактический выбор IPAddress в качестве упражнения для читателя:)


попробуйте это:

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 из ответа выше.