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

Эти "штрафные" 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-вызовы, но я не использую webservices или удаляю

Ответ 1

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

class AwesomeWebClient : WebClient {
    protected override WebRequest GetWebRequest(Uri address) {
        HttpWebRequest req = (HttpWebRequest)base.GetWebRequest(address);
        req.ServicePoint.ConnectionLimit = 10;
        return (WebRequest)req;
    }
}

Ответ 2

для заинтересованных:

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

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

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

Ответ 3

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

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 очищает его.

Ответ 4

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

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

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

Ответ 5

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

Чтобы это было действительно в приложении CONSOLE, мы добавили ссылочную dll System.Configuration. Без ссылки выше было бесполезно.