Я просмотрел Интернет и переполнение стека в поисках ответов, но, похоже, я не могу получить четкого ответа на свои проблемы.
У меня около 50 клиентов по всей стране, которые регулярно открывают вызов WCF WSHTTPBinding автоматически через службу Windows на сервер каждые 10-20 минут. Это хорошо работает, потому что я ограничиваю количество клиентов, которые могут подключаться и выполнять длительные операции через сервер, а затем клиент знает, что он ничего не может сделать, и пытается в следующий раз выполнить повторную проверку.
Это работало хорошо до вчерашнего дня, когда у одного клиента, у которого есть 7 отдельных систем за одним и тем же маршрутизатором, начались очень-очень медленные проблемы с Интернетом. Таким образом, эти 7 систем будут открывать соединение с сервером каждые 10-20 минут и выполнять свои процедуры «регистрации». Вызовы займут некоторое время, и каждая система может быть подключена к службе одновременно, используя до 7 подключений к серверу. Остальные 43 системы также должны проходить регистрацию каждые 10-20 минут. Но поскольку у клиента с 7 системами был медленный Интернет, вызовы длительных процессов в сервисе занимали больше времени, чем обычно, и, в конечном итоге, отключались на клиенте (иногда я даже получал устаревшие ошибки меток времени безопасности). В свою очередь, это могло иногда приводить к зависанию службы WCF от ответа на любые другие клиентские запросы, а затем, в конечном итоге, время ожидания клиента истекало, и серверные соединения очищались и обрабатывали другие запросы.
Мне нужно, чтобы на мою службу не влияли проблемы с Интернетом клиентов, и служба должна продолжать работать, обслуживая других клиентов, которые продолжают «регистрироваться».
Теперь я уже реализовал поведение регулирования службы на стороне службы:
Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 20
stb.MaxConcurrentInstances = 120
serviceHost.Description.Behaviors.Add(stb)
Я кое-что почитал и нашел этот параметр, но на данный момент в моем коде его нет:
System.Net.ServicePointManager.DefaultConnectionLimit
Который я пытался понять, но не понял полностью. Итак, теперь с моим объяснением, вот мои вопросы:
- Do I set System.Net.ServicePointManager.DefaultConnectionLimit at the service or client end?
- Where would I set that? Before I open the ServiceHost? Before I create the ServiceHost?
- Are there any other areas to change for connection limits and concurrent calls for WCF? (It seems from my reading there can be a few, depending on what binding you're using)
Примечание. Если вы публикуете ответы, используйте код, я не использую файл конфигурации для своих привязок, я создаю привязку программно.
Спасибо.