У меня есть клиент/серверное приложение WCF, которое обменивается данными через HTTP с помощью WSHttpBinding.WCF Параллельные запросы нагромождения на сервере при использовании WSHttpBinding
Настройка сервера: самостоятельный хостинг, используя стандарт WCF ServiceHost
. Моего фактический класс обслуживания объясняются как:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple,
InstanceContextMode = InstanceContextMode.PerSession,
UseSynchronizationContext = false)]
установка клиента: (. proxy.call_server_method
блокируются до тех пор, пока сервер откликнулся полностью) с помощью визуально-студии сгенерированного прокси-клиента с использованием синхронных обслуживания вызовов
Сценарий: У меня есть один конкретный вызов метода, который занимает 20 секунд для выполнения на сервере. Клиент вызывает этот метод в отдельном потоке, поэтому он не удерживается, а ConcurrencyMode.Multiple
означает, что WCF должен выполнить его в отдельном потоке на сервере.
Эта теория подтверждается тем фактом, что при настройке моего приложения на использование NetTcpBinding
все работает нормально.
Проблема:
Если настроить приложение, чтобы использовать WSHttpBinding
, то этот длинный вызов метода вызывает запросы НТТР «резервные копии». Я проверил это поведение как от проверки моих журналов, так и от отладки HTTP-запросов с помощью скрипта.
Пример:
- Клиент инициирует 20-секундный длинный запрос на фоновом потоке
- Клиент инициирует запрос B и C на переднем плане резьбы
- запросы B и C будут посланы на сервер, который Безразлично «т обрабатывать их, пока это не будет сделано с 20-секундного длинного запроса
Но иногда:
- Запросы B и C не отправляются (они даже не появляются в скрипаче), пока не возвращается 20-секундный запрос (это редко).
- Примечание: установка
<add address="*" maxconnection="100"/>
в файле app.config клиента сделала это (как представляется) прекратить свое существование.
- Примечание: установка
- Запрос B отсылается и получает ответ немедленно, в то время как запрос C не сдерживали до 20 секунд один заканчивает (это редко)
Вот хронология от скрипача, демонстрирующая проблемы: (Увеличенная версия)
Как вы можете видеть, запросы все получать резервные копии на сервере. Как только 20-секундный запрос завершен, все ответы наступают, но обратите внимание, что есть некоторые запросы, которые не являются ...
Так, Вопросы:
- Какого черта здесь происходит? Почему он работает нормально, используя
NetTcpBinding
и не работает с использованиемWSHttpBinding
? - Почему непоследовательное поведение?
- Что я могу сделать, чтобы исправить это?
Примечания:
- Это не замок на сервере. Я установил точки останова и использовал
!syncblk
, и он постоянно сообщает, что блокировки не удерживаются. - Это не мои потоковый (NetTcpBinding не должен работать в противном случае)
- У меня есть
<serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
набора в app.config сервера - 20-секундный звонок просто ждет на таймере, это не обмолот процессора или диск или сети
- Я бы предпочел решение, которое не предполагало повторное архивирование приложения для использования асинхронных вызовов ... это большой набор устаревшего кода, и я действительно не хочу возиться с вещами, Т понять.
+1 Отличная планировка вопроса. –
Вы когда-нибудь решали эту проблему? Если да, то как вы его решили? – DivisionByZorro
Добавил самостоятельный ответ, описывающий наше окончательное «решение» –