Я просматривал Интернет и переполнял стек, чтобы найти ответы, но, похоже, не могу получить четкий ответ на свои вопросы.
У меня около 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? (По моим прочтениям их может быть несколько, в зависимости от того, какую привязку вы используете)
Примечание. Если вы публикуете ответы, пожалуйста, используйте код, я не использую файл конфигурации для своих привязок, я создаю свою привязку программно.
Спасибо.