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

те" штрафные " RFCs мандат от каждого 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)

но как я могу сделать это программно?

Accordin к http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

" изменение свойства DefaultConnectionLimit не влияет на существующие Объекты ServicePoint; это влияет только на объекты ServicePoint, которые инициализируется после изменения. Если значение этого свойства не было установите или сразу или через конфигурацию, значение по умолчанию к постоянный DefaultPersistentConnectionLimit."

Я хотел бы лучше всего настроить предел, когда я создаю экземпляр WebClient, но просто удаление этого печального ограничения программно в начале моей программы было бы хорошо.

сервер, к которому я обращаюсь, не является обычным веб-сервером в интернете, но под моим контролем и в локальной сети. Я хочу делать API-вызовы, но я не использую веб-сервисы или remoting

5 ответов


С некоторыми советами отсюда и из других мест мне удалось исправить это в моем приложении, переопределив класс 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;
}

1-й раз кто-то называет это FindServicePoint, a ServicePoint экземпляр создан и WeakReference создается, чтобы держаться за него внутри ServicePointManager. Последующие запросы к менеджеру для того же Uri возвращают тот же экземпляр. Если соединение не используется после, GC очищает его.


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

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

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


У нас есть ситуация, касающаяся вышеуказанной части конфигурации в приложении.Конфиг

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