Веб-запросы с привязкой разных IP-адресов с использованием BindIPEndPointDelegate не приводят к множеству ServicePoints для одного хоста в многопоточности
Категория:
Увеличение пропускной способности
Сценарий:
Несколько HttpWebRequests должны быть отправлены через разные адаптеры Ethernet на один и тот же хост.
Ключи для запоминания:
- Запросы отправляются на тот же хост.
- Существует встроенный лимит для каждого хоста в качестве точки обслуживания.
- Количество одновременных запросов к хосту можно использовать, установив System.Net.ServicePointManager.DefaultConnectionLimit равным 100 (например) или установив webRequest.ServicePoint.ConnectionLimit = 50 (скажем) для объектов веб-запросов с тем же URI.Источники:
Образец кода:
Полный Гист(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.