Эти "прекрасные" RFC предписывают каждому RFC-клиенту избегать использования более двух соединений на хост ...
Microsoft реализовала это в WebClient. Я знаю, что это можно выключить с помощью
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
</configuration>
(можно найти на http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007 )
Но как это сделать программно?
Согласно http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx
«Изменение свойства DefaultConnectionLimit не влияет на существующие объекты ServicePoint; оно влияет только на объекты ServicePoint, которые инициализируются после изменения. Если значение этого свойства не было установлено напрямую или через конфигурацию, по умолчанию используется константа DefaultPersistentConnectionLimit».
Я хотел бы лучше всего настроить ограничение при создании экземпляра WebClient, но было бы неплохо просто удалить это печальное ограничение программно в начале моей программы.
Сервер, к которому я обращаюсь, не является обычным веб-сервером в Интернете, но находится под моим контролем и в локальной сети. Я хочу делать API-вызовы, но не использую веб-сервисы и удаленное взаимодействие
Ответы:
С некоторыми советами отсюда и из других источников мне удалось исправить это в моем приложении, переопределив класс WebClient, который я использовал:
class AwesomeWebClient : WebClient { protected override WebRequest GetWebRequest(Uri address) { HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address); req.ServicePoint.ConnectionLimit = 10; return (WebRequest)req; } }
источник
System.Net.ServicePointManager.DefaultConnectionLimit
- лучшее решение, так как нельзя предполагать, чтоWebRequest
этоHttpWebRequest
, например, может бытьFileRequest
.для заинтересованных:
System.Net.ServicePointManager.DefaultConnectionLimit = x
(где x - желаемое количество подключений)нет необходимости в дополнительных ссылках
просто убедитесь, что это вызвано ДО создания точки обслуживания, как указано выше в сообщении.
источник
Это решение позволяет в любой момент изменить лимит подключения :
private static void ConfigureServicePoint(Uri uri) { var servicePoint = ServicePointManager.FindServicePoint(uri); // Increase the number of TCP connections from the default (2) servicePoint.ConnectionLimit = 40; }
В первый раз, когда кто-либо вызывает этот FindServicePoint , создается экземпляр ServicePoint и создается WeakReference, чтобы удерживать его внутри ServicePointManager . Последующие запросы к менеджеру для одного и того же Uri возвращают тот же экземпляр. Если после этого соединение не используется, GC очищает его.
источник
ServicePoint
потеряно (вместе с вашими настройками) послеMaxIdleTime
Если вы обнаружите, что объект ServicePoint используется вашим WebClient, вы можете изменить его ограничение на количество подключений. У объектов HttpWebRequest есть метод доступа для извлечения того, который они были созданы для использования, поэтому вы можете сделать это таким образом. Если вам повезет, все ваши запросы могут в конечном итоге использовать одну и ту же ServicePoint, поэтому вам нужно будет сделать это только один раз.
Я не знаю глобального способа изменить лимит. Если вы измените DefaultConnectionLimit достаточно рано в процессе выполнения, у вас, вероятно, все будет хорошо.
В качестве альтернативы, вы можете просто жить с ограничением количества подключений, поскольку большинство серверного программного обеспечения все равно будет вас задушить. :)
источник
У нас есть ситуация с приведенной выше конфигурацией в App.Config.
Чтобы это было действительным в КОНСОЛЬНОМ приложении, мы добавили ссылочную dll System.Configuration. Без ссылки все вышесказанное было бесполезно.
источник