Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用BindIPEndPointDelegate绑定不同IP的webrequests不会在多线程中为同一主机生成多个ServicePoints 类别:_C#_Multithreading_Httpwebrequest_Servicepoint - Fatal编程技术网

C# 使用BindIPEndPointDelegate绑定不同IP的webrequests不会在多线程中为同一主机生成多个ServicePoints 类别:

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(例如)。

吞吐量增量

脚本: 多个HttpWebRequests需要通过不同的以太网适配器发送到同一主机

要记住的关键点:
  • 请求将发送到同一主机
  • 作为servicepoint,每个主机都有一个内置的限制
  • 通过设置,可以利用对主机的同时请求数 System.Net.ServicePointManager.DefaultConnection限制为100(例如), 或者为具有相同uri的webRequest对象设置webRequest.ServicePoint.ConnectionLimit=50(例如)。 资料来源:
    • (问题)
      • (答复)
      • (答复)
    • (讨论)
示例代码: (目标框架.Net 2.0)

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();