Дросселирование службы WCF

У меня есть служба WCF, развернутая в консольном приложении с включенным базовым HTTTPBinding и SSL. Также установлен следующий атрибут:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

Я также установил поведение дросселирования на

<serviceThrottling maxConcurrentCalls="2147483647" maxConcurrentSessions="2147483647"
        maxConcurrentInstances="2147483647" />

С другой стороны, я создал тестовый клиент (для теста нагрузки), который одновременно инициирует несколько клиентов (несколько потоков) и выполняет транзакции на сервере. Все кажется прекрасным, но на сервере загрузка процессора не увеличивается, поэтому я добавил несколько журналов для просмотра количества одновременных вызовов на сервер и обнаружил, что он никогда не переходил на 6.

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

Итак, я хочу спросить, где проблема в этой ситуации? Я еще не указал каких-либо ContextMode или ConcurrencyMode.

После этого сообщения я заметил, что всякий раз, когда я запускаю другой клиент тестового клиента, мой параллельный счетчик вызовов сервера увеличивается до 2, как если бы я запускал только 1 экземпляр, максимальные одновременные вызовы Rcvd будут равны 2, и если есть два экземпляра одинакового значения идет до 4 и так далее. Есть ли какой-либо предел количества вызовов WCF из процесса?

******** Добавлено 17 марта ********

Сегодня я провел еще один тест с одним тестовым клиентом (с 50 одновременными пользователями) на том же компьютере, на котором работает сервер. На этот раз я получаю точный результат, который я хотел бы показать (т.е. Максимальные одновременные вызовы Rcvd на сервере = 50).

Но мне нужно сделать то же самое на других машинах. Может ли кто-нибудь помочь мне в этом?

Ответ 1

Я нашел решение: на ServicePointManager существует ограничение на соединение, которое вызывает эту проблему. Чтобы удалить этот предел, вам просто нужно установить

System.Net.ServicePointManager.DefaultConnectionLimit = X;

где предел по умолчанию равен 2.

Ответ 2

Или используйте эту конфигурацию в клиенте.

<system.net>
    <connectionManagement>
      <add maxconnection = "200" address ="*" />
    </connectionManagement>
  </system.net>

Здесь 200 - это предел от клиента