C# 使用BindIPEndPointDelegate绑定不同IP的webrequests不会在多线程中为同一主机生成多个ServicePoints 类别:
吞吐量增量 脚本: 多个HttpWebRequests需要通过不同的以太网适配器发送到同一主机 要记住的关键点:C# 使用BindIPEndPointDelegate绑定不同IP的webrequests不会在多线程中为同一主机生成多个ServicePoints 类别:,c#,multithreading,httpwebrequest,servicepoint,C#,Multithreading,Httpwebrequest,Servicepoint,吞吐量增量 脚本: 多个HttpWebRequests需要通过不同的以太网适配器发送到同一主机 要记住的关键点: 请求将发送到同一主机 作为servicepoint,每个主机都有一个内置的限制 通过设置,可以利用对主机的同时请求数 System.Net.ServicePointManager.DefaultConnection限制为100(例如), 或者为具有相同uri的webRequest对象设置webRequest.ServicePoint.ConnectionLimit=50(例如)。
- 请求将发送到同一主机
- 作为servicepoint,每个主机都有一个内置的限制
- 通过设置,可以利用对主机的同时请求数
System.Net.ServicePointManager.DefaultConnection限制为100(例如),
或者为具有相同uri的webRequest对象设置webRequest.ServicePoint.ConnectionLimit=50(例如)。
资料来源:
- (问题)
- (答复)
- (答复)
- (讨论)
- (问题)
uriurl=新的Uri(“https://d585tldpucybw.cloudfront.net/docs/default-source/fiddler/fiddler4setup.exe?sfvrsn=80");
ServicePoint sp=ServicePointManager.FindServicePoint(url);
sp.BindIPEndPointDelegate=委托(
服务点服务点,
IPEndPoint远程端点,
int retryCount)
{
//如果localpoint中引用的IP不存在,此委托将在几秒钟内重试7000多次,阻塞其他线程。小心!!!
Console.WriteLine(“重试计数段”+segmentEndPoint.segNumber+”对于ip为“+segmentEndPoint.ipEndPoint”的eth是“+retryCount+”);
//Console.WriteLine(“ip:+segmentEndPoint.ipEndPoint”);
如果(retryCount<200)
{
返回segmentEndPoint.ipEndPoint;
}
其他的
{
返回null;
}
};
sp.ConnectionLimit=5;
sp.ConnectionLaseTimeout=0;
HttpWebRequest webRequest=(HttpWebRequest)webRequest.Create(url);
webRequest.Proxy=null;//如果未设置,HttpWebRequest将搜索系统范围内的代理集,耗时2-8秒!
webRequest.ConnectionGroupName=segmentEndPoint.segNumber+“嘿”;
webRequest.KeepAlive=false;
WriteLine(“ServicePoint:{0},线程:{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()为所有webRequest提供相同的哈希值
- 每个webrequest都使用相同的servicepoint,尽管已明确设置为通过servicepoint上的BindIPdelegate为每个HttpWebRequest使用不同的以太网连接
- 来自不同线程中的webrequests对同一主机的多个请求。(通过设置servicepoint.ConnectionLimit解决)(上述来源)
- 使用原始套接字
- 如果依赖于同一servicemanager servicepoint场景,则此解决方案可能无法工作
devprashant.如果您想了解更多信息,请随时在此处发表评论。谢谢。req1、2和3都是同一个主机吗?@spender。对上面在“记住的关键”一节中提到了这一点。irc的guideX和gufi的要点基于这些建议,我已经开始构建类似的东西,但后来我发现在使用代理和https时绑定到某些网络适配器不起作用:/
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();