C# 通过特定网络适配器发送HttpWebRequest
我有两个无线网络适配器连接到我的计算机,每个适配器连接到不同的网络。我想建立一种代理服务器,我的浏览器将连接到它,它将从不同的适配器发送HTTP请求,这样网页上的加载时间将更小。 你们知道我如何决定从哪个网络适配器发送HttpWebRequest吗 谢谢:) 更新 我使用了以下代码:C# 通过特定网络适配器发送HttpWebRequest,c#,httpwebrequest,C#,Httpwebrequest,我有两个无线网络适配器连接到我的计算机,每个适配器连接到不同的网络。我想建立一种代理服务器,我的浏览器将连接到它,它将从不同的适配器发送HTTP请求,这样网页上的加载时间将更小。 你们知道我如何决定从哪个网络适配器发送HttpWebRequest吗 谢谢:) 更新 我使用了以下代码: public static IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int r
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();
}
publicstaticipendpointbindipendpointcallback(servicepointservicepoint、ipendpointremoteendpoint、int-retryCount)
{
List ipep=新列表();
foreach(System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()中的变量i)
{
foreach(i.GetIPProperties().UnicastAddress中的变量ua)
ipep.Add(新的IPEndPoint(ua.Address,0));
}
返回新的IPEndPoint(ipep[1]。地址,ipep[1]。端口);
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(“http://whatismyip.com");
request.ServicePoint.BindIPEndPointDelegate=新的BindIPEndPoint(BindIPEndPointCallback);
HttpWebResponse=(HttpWebResponse)request.GetResponse();
StreamReader sr=新的StreamReader(response.GetResponseStream());
字符串x=sr.ReadToEnd();
}
但即使更改了我发送的IP地址,我从WhatIsMyIp获得的IP地址仍然是一样的。。有什么帮助吗?很可能就是你想要的。它允许您强制将特定的本地IP作为发送HttpWebRequest的端点。此示例适用于我:
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 ();
}
}
}
这是因为WebRequest使用ServicePointManager,它缓存用于单个URI的实际ServicePoint。因此,在您的情况下,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);
}
}
}
}
@伊菲-没问题,很高兴我能帮忙。如果您确信满意,请接受我的回答。是的,您可以通过
HttpWebRequest
上的ServicePoint
属性使用BindIPEndPointDelegate
来选择从哪个适配器发送请求。这个问题的公认答案有一个工作示例()。您是否通过代理连接?