Настраиваемый диспетчер каналов
Этот образец демонстрирует построение пользовательского стека каналов путем непосредственной реализации ServiceHostBase, а также создание пользовательского диспетчера каналов в среде веб-узла. Диспетчер каналов взаимодействует с IChannelListener для принятия каналов и получения сообщений из стека каналов. В рамках этого образца также представлен базовый образец, показывающий, как построить стек каналов в среде веб-узла с помощью VirtualPathExtension.
Пользовательский ServiceHostBase
Вместо ServiceHost этот образец реализует базовый тип ServiceHostBase для демонстрации замены реализации стека Windows Communication Foundation (WCF) пользовательским уровнем обработки сообщений поверх стека каналов. Для построения прослушивателей и диспетчера каналов переопределяется виртуальный метод InitializeRuntime.
Чтобы реализовать службу, размещенную на веб-сервере, возвратите расширение службы VirtualPathExtension из коллекции Extensions и добавьте его в коллекцию BindingParameterCollection, чтобы транспортному слою было известно, как настроить прослушиватель канала на основе параметров среды размещения, то есть параметров служб IIS/службы активации Windows (WAS).
Настраиваемый диспетчер каналов
Пользовательский диспетчер каналов расширяет тип ChannelDispatcherBase. Этот тип реализует логику программирования уровня канала. В этом образце для шаблона обмена сообщениями «запрос-ответ» поддерживается только IReplyChannel, при этом пользовательский диспетчер каналов можно легко расширить, добавив другие типы каналов.
Сначала диспетчер открывает прослушиватель каналов, а затем принимает одноэлементный канал ответа. По этому каналу он запускает бесконечный цикл отправки сообщений (запросов). По каждому запросу он создает ответное сообщение и отправляет его назад клиенту.
Создание ответного сообщения
Обработка сообщений реализуется в типе MyServiceManager
. В методе HandleRequest
сначала проверяется заголовок Action
сообщения, чтобы выяснить, поддерживается ли запрос. Стандартное действие протокола SOAP «http://tempuri.org/HelloWorld/Hello» определено для выполнения фильтрации сообщений. Это похоже на концепцию контракта службы из реализации WCF объекта ServiceHost.
Для выбора правильного действия протокола SOAP образец получает запрошенные данные сообщения и формирует соответствующий ответ на запрос, аналогично случаю ServiceHost.
В этом случае команда HTTP-GET была специально обработана путем возврата пользовательского сообщения HTTP с тем, чтобы можно было открыть службу в веб-обозревателе, чтобы удостовериться, что она правильно скомпилирована. Если действие протокола SOAP не совпадает, отправьте сообщение об ошибке, чтобы указать, что запрос не поддерживается.
В этом образце используется обычный клиент WCF, в котором не сделано никаких предположений относительно службы. Поэтому служба создана с учетом соответствия результатам стандартной реализации WCF ServiceHost. В результате этого в клиенте требуется наличие только контракта службы.
Использование образца
При прямом запуске клиентского приложения формируется следующий результат.
Клиент разговаривает со службой WCF типа «запрос-ответ».
Введите то, что хотите сказать серверу: Привет
Сервер ответил: Вы сказали: Привет. Идентификатор сообщения: 1
Сервер ответил: вы сказали: Привет. Идентификатор сообщения: 2
Сервер ответил: вы сказали: Привет. Идентификатор сообщения: 3
Сервер ответил: вы сказали: Привет. Идентификатор сообщения: 4
Сервер ответил: вы сказали: Привет. Идентификатор сообщения: 5
Службу также можно открыть в веб-обозревателе с тем, чтобы сообщение HTTP-GET было обработано на сервере. При этом возвращается хорошо отформатированный текст в формате HTML.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WCF\Extensibility\Channels\CustomChannelDispatcher
|