Отправка HttpWebRequest через определенный сетевой адаптер - PullRequest
10 голосов
/ 02 мая 2011

К моему компьютеру подключены два адаптера беспроводной сети, каждый из которых подключен к другой сети.Я хотел бы создать своего рода прокси-сервер, к которому подключался бы мой браузер, и он отправлял бы HTTP-запросы каждый из разных адаптеров, чтобы время загрузки веб-страниц было меньше.Ребята, вы знаете, как я могу решить, с какого сетевого адаптера отправить запрос HttpWebRequest?

Спасибо:)

ОБНОВЛЕНИЕ

Я использовал этот код:

public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
    List<IPEndPoint> ipep = new List<IPEndPoint>();
    foreach (var i in System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces())
    {
        foreach (var ua in i.GetIPProperties().UnicastAddresses)
            ipep.Add(new IPEndPoint(ua.Address, 0));
    }
    return new IPEndPoint(ipep[1].Address, ipep[1].Port);
}

private void button1_Click(object sender, EventArgs e)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://whatismyip.com");
    request.ServicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());
    string x = sr.ReadToEnd();
}

Но даже если изменение IPEndPoint, которое я отправляю, IP-адрес, полученный от WhatIsMyIp, остается прежним ... любая помощь?

Ответы [ 3 ]

6 голосов
/ 02 мая 2011

BindIPEndPointDelegate вполне может быть тем, что вам нужно. Это позволяет принудительно указывать конкретный локальный IP-адрес в качестве конечной точки, через которую отправляется запрос HttpWebRequest.

2 голосов
/ 04 сентября 2013

Этот пример работает для меня:

using System;
using System.Net;

class Program
{
    public static void Main ()
    {
        foreach (var ip in Dns.GetHostAddresses (Dns.GetHostName ())) 
        {
            Console.WriteLine ("Request from: " + ip);
            var request = (HttpWebRequest)HttpWebRequest.Create ("http://ns1.vianett.no/");
            request.ServicePoint.BindIPEndPointDelegate = delegate {
                return new IPEndPoint (ip, 0);
            };
            var response = (HttpWebResponse)request.GetResponse ();
            Console.WriteLine ("Actual IP: " + response.GetResponseHeader ("X-YourIP"));
            response.Close ();
        }
    }
}
0 голосов
/ 22 сентября 2015

Это потому, что WebRequest использует ServicePointManager и кэширует фактическую ServicePoint, которая использовалась для одного URI. Таким образом, в вашем случае BindIPEndPointDelegate вызывается только один раз, и все последующие CreateRequest повторно используют один и тот же связанный интерфейс. Вот немного более низкий пример с TcpClient, который на самом деле работает:

        foreach (var iface in NetworkInterface.GetAllNetworkInterfaces())
        {
            if (iface.OperationalStatus == OperationalStatus.Up && iface.NetworkInterfaceType != NetworkInterfaceType.Loopback)
            {
                Console.WriteLine("Interface: {0}\t{1}\t{2}", iface.Name, iface.NetworkInterfaceType, iface.OperationalStatus);
                foreach (var ua in iface.GetIPProperties().UnicastAddresses)
                {
                    Console.WriteLine("Address: " + ua.Address);
                    try
                    {
                        using (var client = new TcpClient(new IPEndPoint(ua.Address, 0)))
                        {
                            client.Connect("ns1.vianett.no", 80);
                            var buf = Encoding.UTF8.GetBytes("GET / HTTP/1.1\r\nConnection: close\r\nHost: ns1.vianett.no\r\n\r\n");
                            client.GetStream().Write(buf, 0, buf.Length);
                            var sr = new StreamReader(client.GetStream());
                            var all = sr.ReadToEnd();
                            var match = Regex.Match(all, "(?mi)^X-YourIP: (?'a'.+)$");
                            Console.WriteLine("Your address is " + (match.Success ? match.Groups["a"].Value : all));
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }
                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...