Как я могу программно удалить ограничение на 2 соединения в WebClient - PullRequest
87 голосов
/ 15 мая 2009

Эти "хорошие" RFC требуют от каждого RFC-клиента, что они опасаются не использовать более 2 соединений на хост ...

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-вызовы, но я не использую веб-сервисы или удаленное взаимодействие

Ответы [ 5 ]

119 голосов
/ 31 августа 2010

для интересующихся:

System.Net.ServicePointManager.DefaultConnectionLimit = x (где x - желаемое количество соединений)

нет необходимости в дополнительных ссылках

просто убедитесь, что это называется ДО создания точки обслуживания, как указано выше в сообщении.

50 голосов
/ 13 августа 2009

С некоторыми советами из этого и других источников мне удалось исправить это в моем приложении, переопределив класс WebClient, который я использовал:

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}
6 голосов
/ 13 января 2015

Это решение позволяет изменить предел подключения в в любое время :

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 возвращают тот же экземпляр. Если после этого соединение не используется, ГХ очищает его.

5 голосов
/ 15 мая 2009

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

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

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

4 голосов
/ 27 февраля 2010

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

Для того, чтобы это действовало в приложении КОНСОЛЬ, мы добавили ссылку System.Configuration dll. Без ссылки вышеупомянутое было бесполезно.

...