как изменить исходный 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();
}

person Tudor Carean    schedule 27.07.2010    source источник
comment
Пожалуйста, переформатируйте немного, чтобы код было легче читать.   -  person riwalk    schedule 27.07.2010
comment
Извините. Я вставил его, и вот как это размещено на форуме. Не знаю, почему. Сейчас должно быть лучше.   -  person Tudor Carean    schedule 27.07.2010
comment
Спасибо. Я понимаю, как это происходит :)   -  person riwalk    schedule 27.07.2010


Ответы (2)


Согласно этому, нет. Возможно, вам придется перейти к использованию сокетов, где, как я знаю, вы можете выбрать локальный IP-адрес.

РЕДАКТИРОВАТЬ: на самом деле кажется, что это возможно. 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, вы можете избавиться от него. Кроме того, я оставляю фактический выбор IP-адреса в качестве упражнения для читателя :)

person Mike Caron    schedule 27.07.2010
comment
этот парень хотел подделать IP. Он хотел использовать IP, который ему не принадлежит. В моем случае эти IP-адреса указаны на моем сетевом интерфейсе. - person Tudor Carean; 27.07.2010
comment
Идея та же. Однако похоже, что то, что вам нужно, ВОЗМОЖНО... Я отредактировал свой ответ, чтобы отразить это, и я нахожусь в процессе создания примера/тестирования... - person Mike Caron; 27.07.2010
comment
Хорошо, я добавил пример. :D - person Mike Caron; 27.07.2010
comment
+1 интересно. Я пробовал, и он крутится по кругу, потому что его нельзя связать. Думал, что вы можете выбрать случайные IP-адреса - думаю, нет - person BritishDeveloper; 12.05.2011
comment
BritishDeveloper, вы не можете выбрать любой IP наугад. Это должен быть IP-адрес адаптера, подключенного к вашему компьютеру. Если вы продолжаете выбирать IP-адрес, который он не может связать, он будет продолжать вызывать делегата. Решение состоит в том, чтобы либо использовать IPAddress.Any (или эквивалент IPV6), либо перечислить устройства, чтобы найти то, которое вы можете использовать. (рекомендую первое) - person Mike Caron; 13.05.2011
comment
Я разместил аналогичный вопрос здесь, я был бы очень признателен, если бы вы могли Помоги мне. - person ; 21.08.2012
comment
+1. У меня были спортивные проблемы с подключением к моему серверу IPv6. Теперь все хорошо. Спасибо. - person Jesse Chisholm; 26.08.2012
comment
@opaera Вы не можете привязаться к IP-адресу, который не принадлежит ни одному сетевому интерфейсу на вашем сервере. Используйте IPAddress.Any или выберите тот, который у вас есть. - person Mike Caron; 11.09.2012
comment
У меня есть большая партия IP-адресов на моем сервере, это именно то, что мне нужно, чтобы разрешить изменение того, который я использую для исходящих подключений. классно. - person Brady Moritz; 22.11.2012
comment
Я использую это для создания множества исходящих соединений, используя пару IP-адресов. Имеет ли смысл повторно использовать один и тот же делегат или просто создавать новый для каждого запроса? Также я вижу случайные ошибки, которые, кажется, возникают из-за того, что используется неправильный ip... не знаю, как это может происходить... - person Brady Moritz; 12.08.2013

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

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

person Brady Moritz    schedule 12.08.2013