我是大学四年级的学生。我的毕业设计是一个下载管理器,我打算用C#编写代码。 当检查MSDN文档时,项目看起来很简单。但问题是我的老师要我将多宿主纳入项目。他希望下载管理器:
我可以完成前三个步骤,但我找不到第四步的解决方案,所以任何人都可以请求帮助我或通过正确的方式指导我。
我不是一个经验丰富的网络和协议程序员我只选择C#,因为它简化了发送和请求文件的过程。
答案 0 :(得分:4)
我相信您的答案取决于ServicePoint.BindIPEndPointDelegate
属性,您可以在HttpWebRequest
实例中设置该属性。引用MSDN:
某些负载平衡技术要求客户端使用特定的 本地IP地址和端口号,而不是
IPAddress.Any
(或 互联网协议版本6的IPAddress.IPv6Any
和短暂的 港口。您的BindIPEndPointDelegate
可以满足此要求。
基本上,BindIPEndPointDelegate
允许您选择用于连接的本地端点。您可以使用Dns.GetHostAddresses(Dns.GetHostName())
检索所有本地IP地址的列表,然后在委托中随机选择一个。但是,您需要小心匹配地址族:如果远程端点是IPv6,则需要选择本地IPv6地址。
我在下面提供了一些示例代码。
Uri uri = new Uri("http://google.com");
Random random = new Random();
IPAddress[] localAddresses = Dns.GetHostAddresses(Dns.GetHostName());
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
webRequest.ServicePoint.BindIPEndPointDelegate =
(servicePoint, remoteEndPoint, retryCount) =>
{
var allowedLocalAddresses =
localAddresses.Where(localAddress =>
localAddress.AddressFamily == remoteEndPoint.AddressFamily).ToArray();
IPAddress selectedLocalAddress =
allowedLocalAddresses[random.Next(allowedLocalAddresses.Length)];
return new IPEndPoint(selectedLocalAddress, 0);
};
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
参考文献:
编辑:我并不是说您应该为项目随机选择本地地址;上面的代码只是我能想到的最简单的演示。如果您要建立多个并发连接并希望最大化所有可用适配器的负载平衡,那么您应该循环通过您的本地地址;这将确保所有适配器都处理大约相等数量的连接。