Ограничения дросселирования и подключения WCF - PullRequest
1 голос
/ 11 февраля 2011

Я просматривал Интернет и переполнял стек, чтобы найти ответы, но, похоже, не могу получить четкий ответ на свои вопросы.

У меня около 50 клиентов по всей стране, которые регулярно открывают вызов WCF WSHTTPBinding автоматически через службу Windows на сервер каждые 10-20 минут. Это работает хорошо, потому что я ограничиваю # клиентов, которые могут подключаться и выполнять длительные операции через сервер, и клиент тогда знает, что он ничего не может сделать, и пытается в следующий раз при повторной регистрации.

Это работало хорошо до вчерашнего дня, когда у одного клиента, имеющего 7 отдельных систем за одним и тем же маршрутизатором, начались очень медленные проблемы с интернетом. Таким образом, эти 7 систем будут открывать соединение с сервером каждые 10-20 минут и выполнять свои процедуры «регистрации». Звонки могут занять некоторое время, и каждая система может быть подключена к услуге одновременно, используя до 7 подключений к серверу. Остальные 43 системы также должны регистрироваться каждые 10-20 минут. Но так как у клиента с 7 системами был медленный интернет, вызовы к долго выполняющимся процессам в serice выполнялись дольше, чем обычно, и в конечном итоге время ожидания на клиенте (иногда я даже получал устаревшие ошибки отметки времени безопасности). Это, в свою очередь, иногда приводило к зависанию службы WCF от ответа на любые другие клиентские запросы, а затем, в конечном счете, время ожидания клиента истекало, а соединения с сервером очищались и обрабатывали другие запросы.

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

Теперь я реализовал поведение регулирования обслуживания уже в конце службы:

Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 20
stb.MaxConcurrentInstances = 120

serviceHost.Description.Behaviors.Add(stb)

Я кое-что прочитал и нашел этот параметр, но на данный момент в моем коде его нет:

System.Net.ServicePointManager.DefaultConnectionLimit

Что я пытался понять, но не совсем. Итак, теперь с моим объяснением, вот мои вопросы:

  • Установить ли System.Net.ServicePointManager.DefaultConnectionLimit на стороне службы или клиента?
  • Где бы я это установил? Прежде чем открыть ServiceHost? Прежде чем создать ServiceHost?
  • Есть ли какие-либо другие области, которые нужно изменить для ограничения соединения и одновременных вызовов для WCF? (По моим прочтениям их может быть несколько, в зависимости от того, какую привязку вы используете)

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

Спасибо.

1 Ответ

0 голосов
/ 12 февраля 2011

Я не понимаю, что делает ваш сервис, что «медленный интернет» должен на него повлиять.Вы отправляете огромное количество данных туда и обратно при каждой регистрации?Без каких-либо подробностей о дизайне трудно сказать, что происходит.

Тем не менее, я думаю, вам стоит взглянуть на дизайн еще раз.Если сервер выполняет действительно длительную операцию, прежде чем он сможет ответить клиенту, клиент не должен просто торчать и ждать его по HTTP в течение 10 минут за один раз.Было бы более целесообразно отправить запрос, а затем либо периодически проверять, выполнено ли оно (и не требуется ли хранить соединение), либо использовать net.tcp в качестве привязки и использовать что-то, что больше подходит для хранения таких длинных соединенийnet.tcp также может использовать обратный вызов для уведомления клиента о завершении вызова).

...