2

类别:

吞吐量增量

设想:

多个 HttpWebRequest需要通过不同的以太网适配器发送到同一主机。

要记住的关键:

示例代码:

完整的要点(目标框架 .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 场景,此解决方案可能不起作用。

请求的建议。问候。开发者。

4

0 回答 0