2016-01-21 2 views
2

Я звоню в веб-службу в многопоточной среде. Многие мои вызовы терпят неудачу из-за тайм-аута работы или плохого запроса, но ни один из вызовов не работает, если я делаю это линейным образом, что означает, что есть проблема с вызовом web-сервиса с несколькими потоками. После много анализа я обнаружил, что существует ограничение на одновременное соединение, которое вызывает это исключение, поэтому я исправил его, добавив ниже код.Недостаток увеличения ServicePointManager.DefaultConnectionLimit

ServicePointManager.DefaultConnectionLimit = 2 * _ThreadCount; 

То, что я не знаю, является возможным недостатком увеличения этого предела. По умолчанию ограничение подключения равно 2. Если кто-либо знает какие-либо недостатки, пожалуйста, дайте мне знать.

ответ

1

MSDN говорит:

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

и

Примечание

Любые изменения в свойстве DefaultConnectionLimit влияют как HTTP 1.0 и HTTP 1.1 соединения. Невозможно отдельно изменить ограничение соединения для протоколов HTTP 1.0 и HTTP 1.1. При использовании в среды сервера (ASP.NET) DefaultConnectionLimit по умолчанию для большего числа соединений, что 10.

+0

MSDN также заявляет, что значением по умолчанию является MaxValue, но когда я отлаживаю, я вижу значение по умолчанию как 2 – Viru

+0

@Viru: - Да, он по умолчанию установлен в MaxValue. Вы уверены, что он не был изменен ранее? –

+0

Нет, где в моем приложении или конфигурации я устанавливаю это значение, но если я его правильно подхожу, это настройка уровня системы, поэтому может быть конфигурация в machine.config, которую я не проверял .... в любом случае, я больше заинтересован в выявлении любых возможных недостатков – Viru

1

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

Фактически, это может фактически помочь вам использовать меньше ресурсов (памяти), так как ожидающие запросы помещаются в очередь внутри ServicePoint. Читайте здесь для получения дополнительной информации: Big size of ServicePoint object after several hours sending HTTP request in parallel

позвольте мне дать вам картину .... у меня есть около 46K задачи, эти задачи побежали в пакете 100 (каждая задача будет вызывать вебсервис), поэтому у меня есть 100 нитей вызова webserivce одновременно. это все еще тривиально? или это будет иметь какое-то влияние в моем случае?

Это, конечно же, будет иметь последствия. Но влияние зависит от многих факторов. Точка обслуживания - для каждого хоста.

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

Если вы в основном делаете запросы против разных хостов, предел в вашем вопросе работает нормально.

Что касается использования ресурсов, это, вероятно, прекрасно, пока ваш сервер не очень занят другими приложениями.

+0

Позвольте мне дать вам фотографию .... У меня около 46K задач, эта задача выполняется в партии по 100 (каждая задача вызовет webservice), поэтому у меня есть 100 потоков, вызывающих webserivce одновременно. это все еще тривиально? или это будет иметь какое-то влияние в моем случае? – Viru

+0

@Viru: Прочтите мое обновление. – jgauffin

+0

Вы хотите сказать, что тот же хост в любом из этих случаев? Если ваши задачи в основном против разных хостов, увеличьте значение DefaultConnectionLimit до большего значения (ожидаемое количество задач в текущей партии исполнения). Если вы в основном делаете запросы против разных хостов, предел в вашем вопросе отлично работает. – Viru