Веб-запросы с привязкой разных IP-адресов с использованием BindIPEndPointDelegate не приводят к множеству ServicePoints для одного хоста в многопоточности

Категория:

Увеличение пропускной способности

Сценарий:

Несколько HttpWebRequests должны быть отправлены через разные адаптеры Ethernet на один и тот же хост.

Ключи для запоминания:

Образец кода:

Полный Гист(Target Framework .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 () дает одинаковый хеш для всех веб-запросов.

Проблемы (не решенные):

  • Каждый веб-запрос использует одну и ту же точку обслуживания, хотя явно настроен на использование разных соединений Ethernet через BindIPdelegate в ServicePoint для каждого запроса HttpWebRequest.

Проблемы (решенные):

  • Несколько запросов на один хост из веб-запросов в разных потоках. (Разрешается через настройку servicepoint.ConnectionLimit)(Источник указан выше).

Дальнейшее решение (будет реализовано, если не решено):

  • Используя Raw Socket.
  • Это решение может не работать, если оно зависит от сценария servicemanager-servicepoint.

Запрошенные предложения. С уважением. devprashant.

0 ответов

Другие вопросы по тегам