Пользовательский перехватчик сообщений
Данный образец демонстрирует использование модели расширяемости канала. В частности, показано, как реализовать пользовательский элемент привязки, который создает фабрики и прослушиватели каналов для перехвата всех входящих и исходящих сообщений в определенной точке стека времени выполнения. В состав образца входят клиент и сервер, которые демонстрируют использование этих пользовательских фабрик.
В этом образце служба и клиент являются консольными программами (EXE). Как клиент, так и служба используют общую библиотеку (DLL), которая содержит пользовательский элемент привязки и ассоциированные с ним объекты времени выполнения.
Примечание |
---|
Процедура настройки и инструкции по построению для этого образца приведены в конце этого раздела. |
Примечание |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\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\MessageInterceptor
|
В образце описана процедура, предлагаемая для создания пользовательского многоуровневого канала в Windows Communication Foundation (WCF) с помощью инфраструктуры канала и согласно рекомендациям WCF. Чтобы создать пользовательский многоуровневый канал, выполните следующие действия.
Выберите формы канала, которые будут поддерживать фабрика и прослушиватель каналов.
Создайте фабрику и прослушиватель каналов, которые поддерживают выбранную форму канала.
Присоедините элемент привязки, добавляющий пользовательский многоуровневый канал в стек каналов.
Добавьте раздел расширения элементов привязки, чтобы представить новый элемент привязки системе конфигурации.
Формы каналов
При создании пользовательского многоуровневого канала в первую очередь необходимо решить, какие формы требуются для канала. Данным инспектором сообщений поддерживается любая форма, поддерживаемая уровнем ниже (например, если уровень ниже может выполнить построение метода IOutputChannel и интерфейса IDuplexSessionChannel, то также предоставляется метод IOutputChannel и интерфейс IDuplexSessionChannel).
Фабрика и прослушиватель каналов
Следующий шаг создания пользовательского многоуровневого канала — реализация интерфейса IChannelFactory для каналов клиентов и интерфейса IChannelListener для каналов служб.
Эти классы получают внутреннюю фабрику и прослушиватель и делегируют все вызовы внутренней фабрике и прослушивателю, кроме OnCreateChannel и OnAcceptChannel.
class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{ ... }
class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{ ... }
Добавление элемента привязки
В образце определен пользовательский элемент привязки InterceptingBindingElement
. Элемент InterceptingBindingElement
принимает ChannelMessageInterceptor
ChannelMessageInterceptor
для обработки сообщений, которые пропускаются через него. Только этот класс должен быть открытым. Фабрика, прослушиватель и каналы — все они могут являться внутренними реализациями открытых интерфейсов времени выполнения.
public class InterceptingBindingElement : BindingElement
Добавление поддержки конфигурации
Для интеграции с конфигурацией привязки библиотека определяет обработчик раздела конфигурации в качестве раздела расширения элемента привязки. Файлы конфигурации клиента и сервера должны зарегистрировать расширение элемента привязки в системе конфигурации. Реализации, требующие предоставить их элементы привязки в системе конфигурации, могут наследовать от этого класса.
public abstract class InterceptingElement : BindingElementExtensionElement { ... }
Добавление политики
Для интеграции с системой политики InterceptingBindingElement
реализует расширение IPolicyExportExtension, чтобы сообщить об участии в создании политики. Чтобы поддержать импорт политики на созданном клиенте, пользователь может зарегистрировать производный класс InterceptingBindingElementImporter
и переопределить CreateMessageInterceptor
(), чтобы создать принадлежащий им класс ChannelMessageInterceptor
с разрешенной политикой.
Пример: инспектор сообщений, допускающий удаление.
Включенный в пример образец реализации ChannelMessageInspector
удаляет сообщения.
class DroppingServerElement : InterceptingElement
{
protected override ChannelMessageInterceptor CreateMessageInterceptor()
{
return new DroppingServerInterceptor();
}
}
Его можно открыть из конфигурации следующим образом:
<configuration>
...
<system.serviceModel>
...
<extensions>
<bindingElementExtensions>
<add name="droppingInterceptor"
type=
"Microsoft.ServiceModel.Samples.DroppingServerElement, library"/>
</bindingElementExtensions>
</extensions>
</system.serviceModel>
</configuration>
Клиент и сервер используют заново созданный раздел конфигурации, чтобы добавить пользовательские фабрики в самый нижний уровень принадлежащих им стеков канала времени выполнения (расположенные над транспортным уровнем).
<customBinding>
<binding name="sampleBinding">
<droppingInterceptor/>
<httpTransport/>
</binding>
</customBinding>
Клиент использует библиотеку MessageInterceptor
, чтобы добавить пользовательский заголовок даже в нумерованные сообщения. С другой стороны, служба использует библиотеку MessageInterceptor
, чтобы удалять любые сообщения, которые не содержат этот специальный заголовок.
Клиент должен предоставить результат своей работы после запуска службы и последующего запуска клиента.
Reporting the next 10 wind speed
100 kph
Server dropped a message.
90 kph
80 kph
Server dropped a message.
70 kph
60 kph
Server dropped a message.
50 kph
40 kph
Server dropped a message.
30 kph
20 kph
Server dropped a message.
10 kph
Press ENTER to shut down client
Клиент отправляет отчет службе о 10 различных значениях скорости ветра, но только половина этих значений помечена специальным заголовком.
Служба должна предоставить следующие результаты:
Press ENTER to exit.
Dangerous wind detected! Reported speed (90) is greater than 64 kph.
Dangerous wind detected! Reported speed (70) is greater than 64 kph.
5 wind speed reports have been received.
Настройка, построение и выполнение образца
Установите ASP.NET 4.0, выполнив следующую команду.
%windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
Убедитесь, что выполнена процедура, описанная в разделе Процедура однократной настройки образцов Windows Communication Foundation.
Чтобы построить решение, следуйте инструкциям в разделе Построение образцов Windows Communication Foundation.
Чтобы выполнить образец на одном или нескольких компьютерах, следуйте инструкциям раздела Running the Windows Communication Foundation Samples.
Первым запустите файл Service.exe, затем Client.exe и наблюдайте результат в обоих окнах консоли.