类别:
吞吐量增量
设想:
多个 HttpWebRequest需要通过不同的以太网适配器发送到同一主机。
要记住的关键:
- 请求将发送到同一主机。
- 作为服务点,每个主机都有一个内置限制。
- 可以通过将 System.Net.ServicePointManager.DefaultConnectionLimit 设置为 100(例如)或通过将 webRequest.ServicePoint.ConnectionLimit = 50(例如)设置为具有相同 uri 的 webrequest 对象来利用对主机的同时请求数。 资料来源:
示例代码:
完整的要点(目标框架 .Net 2.0)。
Uri url = new Uri("https://d585tldpucybw.cloudfront.net/docs/default-source/fiddler/fiddler4setup.exe?sfvrsn=80");
ServicePoint sp = ServicePointManager.FindServicePoint(url);
sp.BindIPEndPointDelegate = delegate (
ServicePoint servicePoint,
IPEndPoint remoteEndPoint,
int retryCount)
{
// If IPs referenced in localpoint does not exists, this delegate retries a 7000+ times in few seconds, blocking other threads. Take care!!!
Console.WriteLine("Retry count segment " + segmentEndPoint.segNumber + " is " + retryCount + " for eth with ip " + segmentEndPoint.ipEndPoint);
//Console.WriteLine("ip: " + segmentEndPoint.ipEndPoint);
if (retryCount < 200)
{
return segmentEndPoint.ipEndPoint;
}
else
{
return null;
}
};
sp.ConnectionLimit = 5;
sp.ConnectionLeaseTimeout = 0;
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Proxy = null; // if not set, HttpWebRequest searches system-wide proxy settins which takers 2-8 seconds!
webRequest.ConnectionGroupName = segmentEndPoint.segNumber + "hey";
webRequest.KeepAlive = false;
Console.WriteLine("ServicePoint: {0}, Thread: {1}", webRequest.ServicePoint.GetHashCode(), segmentEndPoint.segNumber);
var response = webRequest.GetResponse();
response.Close();
想要做:
webreq1 ----- 发送通过 ------- eth1
webreq2 ----- 发送通过 ------- eth2
webreq3 ----- 发送通过 ---- --- eth3
怎么了:
- 如果 webreq1 --- 通过连接发送 ---- eth1
- webreq2 -- 通过连接发送 ---- eth1 (绑定到 eth2 )
- webreq3 -- 通过连接发送 ---- eth1 (绑定到 eth3 )
- webRequest.ServicePoint.GetHashCode() 为所有 web 请求提供相同的哈希值。
问题(未解决):
- 每个 webrequest 都使用相同的服务点,尽管通过 ServicePoint 上的 BindIPdelegate 为每个 HttpWebRequest 明确设置为使用不同的以太网连接。
问题(已解决):
- 来自不同线程中的 webrequests 对同一主机的多个请求。(通过设置 servicepoint.ConnectionLimit 解决)(上面提到的来源)。
进一步的解决方案(将实施,如果没有解决):
- 使用原始套接字。
- 如果依赖于相同的 servicemanager-servicepoint 场景,此解决方案可能不起作用。
请求的建议。问候。开发者。