Поделиться через


Настраиваемый диспетчер каналов

В примере CustomChannelDispatcher показано, как создать стек каналов настраиваемым способом, реализуя ServiceHostBase непосредственно и как создать пользовательский диспетчер каналов в среде веб-узла. Диспетчер каналов взаимодействует с IChannelListener для принятия каналов и получения сообщений из стека каналов. В рамках этого образца также представлен базовый образец, показывающий, как построить стек каналов в среде веб-узла с помощью VirtualPathExtension.

Пользовательский ServiceHostBase

Этот пример реализует базовый тип ServiceHostBase вместо ServiceHost того, чтобы продемонстрировать, как заменить реализацию стека Windows Communication Foundation (WCF) пользовательским уровнем обработки сообщений поверх стека каналов. Для построения прослушивателей и диспетчера каналов переопределяется виртуальный метод InitializeRuntime.

Чтобы реализовать службу, размещенную на веб-сервере, возвратите расширение службы VirtualPathExtension из коллекции Extensions и добавьте его в коллекцию BindingParameterCollection, чтобы транспортному слою было известно, как настроить прослушиватель канала на основе параметров среды размещения, то есть параметров служб IIS/службы активации Windows (WAS).

Настраиваемый диспетчер каналов

Пользовательский диспетчер каналов расширяет тип ChannelDispatcherBase. Этот тип реализует логику программирования уровня канала. В этом образце для шаблона обмена сообщениями «запрос-ответ» поддерживается только IReplyChannel, при этом пользовательский диспетчер каналов можно легко расширить, добавив другие типы каналов.

Сначала диспетчер открывает прослушиватель каналов, а затем принимает одноэлементный канал ответа. По этому каналу он запускает бесконечный цикл отправки сообщений (запросов). По каждому запросу он создает ответное сообщение и отправляет его назад клиенту.

Создание ответного сообщения

Обработка сообщений реализуется в типе MyServiceManager. В методе HandleRequest сначала проверяется заголовок Action сообщения, чтобы выяснить, поддерживается ли запрос. Предопределенное действие http://tempuri.org/HelloWorld/Hello SOAP определяется для фильтрации сообщений. Это похоже на концепцию контракта службы в реализации ServiceHostWCF.

Для выбора правильного действия протокола SOAP образец получает запрошенные данные сообщения и формирует соответствующий ответ на запрос, аналогично случаю ServiceHost.

В этом случае команда HTTP-GET была специально обработана путем возврата пользовательского сообщения HTTP с тем, чтобы можно было открыть службу в браузере, чтобы удостовериться, что она правильно скомпилирована. Если действие протокола SOAP не совпадает, отправьте сообщение об ошибке, чтобы указать, что запрос не поддерживается.

Клиент этого примера является обычным клиентом WCF, который не предполагает ничего из службы. Таким образом, служба специально разработана для сопоставления того, что вы получаете от обычной реализации WCFServiceHost . В результате этого в клиенте требуется наличие только контракта службы.

Использование образца

При прямом запуске клиентского приложения формируется следующий результат.

Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5

Службу также можно открыть в браузере с тем, чтобы сообщение HTTP-GET было обработано на сервере. При этом возвращается хорошо отформатированный текст в формате HTML.