Вот мой сценарий, и в настоящий момент он вызывает у нас немало горя:
У нас есть веб-сервис поставщика, который предоставляет функции телефонии базового уровня.Этот сервис имеет API-интерфейс SOAP, который мы используем для создания пользовательского интерфейса, который интегрирован в наши собственные веб-приложения.API работает на 2 уровнях.Вы выполняете стандартные клиентские вызовы в службу, чтобы инициировать действия, такие как вход в систему, размещение вызова, зависание и т. Д. В другом потоке служба отправляет события обратно клиенту, чтобы предупредить пользователя о происходящих в системе событиях (агент успешно вошел в систему, вызов был отключен и т. д.).
Я реализовал службу WCF, чтобы сидеть между веб-сервером и службой поставщика.Эта служба WCF работает в дуплексном режиме, устанавливая двустороннее соединение с веб-сервером.Веб-сервер выполняет исходящие вызовы в службу WCF, которая направляет их в веб-службу поставщика.События принимаются обратно в службу WCF, которая передает их на веб-сервер через канал обратного вызова на клиенте WCF.Когда события принимаются на веб-сервере, они помещаются в хеш-таблицу с именем пользователя в качестве ключа и в .NET-очередь в качестве значения для хранения события.Каждое событие ставится в очередь агенту, которому оно принадлежит.
Через 2 секунды веб-страница опрашивает веб-сервер с помощью ajax-запроса, чтобы получить новые события для вошедшего в систему пользователя.Он попадает в хеш-таблицу для пользовательского ключа, удаляет все имеющиеся события и сериализует их обратно на веб-страницу.Оттуда они обрабатываются по порядку, и соответствующие сообщения отображаются пользователю.
Эта реализация хорошо работает в однопользовательском сценарии.После того, как я поместил в систему более одного пользователя, я начал получать частые тайм-ауты со следующим CommunicationException:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Мы работаем под управлением Windows Server 2008 R2 на обоих серверах.И веб-приложение, и служба WCF работают в .NET 3.5.Служба WCF работает по протоколу net.tcp в дуплексном режиме.Веб-приложение ASP.NET MVC 2.
Кто-нибудь имел дело с подобным сценарием?Есть ли более эффективный способ (или широко распространенный шаблон) для реализации этого?
РЕДАКТИРОВАТЬ: Одна вещь, которую я забыл упомянуть - я думаю, что увеличение трафика (добавление дополнительных пользователей) только с 1 выделенным каналом обратного вызовавызывает блокировку, которая затем вызывает тайм-аут.В течение любого 5-секундного интервала от службы может быть до 10 последовательных обратных вызовов.