как сменить исходящий IP в HttpWebRequest - PullRequest
15 голосов
/ 27 июля 2010

Я запускаю это приложение на сервере, который назначил 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();
}

Ответы [ 2 ]

26 голосов
/ 27 июля 2010

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

1 голос
/ 13 августа 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-привязки из ответа выше.

...