Как я могу программно удалить ограничение на 2 подключения в WebClient

StackOverflow https://stackoverflow.com/questions/866350

Вопрос

Эти «хорошие» RFC требуют от каждого RFC-клиента не использовать более двух соединений на хост...

Microsoft реализовала это в WebClient.Я знаю, что это можно отключить с помощью

Приложение.конфигурация:

<?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;Это влияет на только объекты обслуживания, которые инициализируются после изменения.Если значение этого свойства не было установлено ни напрямую, ни посредством конфигурации, значение по умолчанию по умолчанию постоянному 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 = 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;
}

Впервые кто-то звонит сюда НайтиServicePoint, а Сервиспоинт создается экземпляр и Слабая ссылка создан, чтобы удерживать его внутри Сервиспоинтманажер.Последующие запросы к менеджеру на тот же Uri возвращают тот же экземпляр.Если после этого соединение не используется, ГХ очищает его.

Если вы обнаружите, что объект ServicePoint используется вашим веб-клиентом, вы можете изменить его ограничение на количество подключений.У объектов HttpWebRequest есть метод доступа для получения того, для использования которого они были созданы, поэтому вы можете сделать это таким образом.Если вам повезет, все ваши запросы могут в конечном итоге использовать одну и ту же точку ServicePoint, поэтому вам придется сделать это только один раз.

Я не знаю какого-либо глобального способа изменить лимит.Если вы изменили DefaultConnectionLimit достаточно рано во время выполнения, с вами, вероятно, все будет в порядке.

В качестве альтернативы вы можете просто жить с ограничением количества подключений, поскольку большинство серверных программ все равно будут вас ограничивать.:)

У нас есть ситуация, связанная с вышеуказанной частью конфигурации в App.Config.

Чтобы это было действительным в приложении консоли, мы добавили ссылку на систему. Конфигурация DLL.Без ссылки все вышесказанное было бесполезно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top