Пользовательский перехватчик сообщений
Пример MessageInterceptor демонстрирует использование модели расширяемости канала. В частности, показано, как реализовать пользовательский элемент привязки, который создает фабрики и прослушиватели каналов для перехвата всех входящих и исходящих сообщений в определенной точке стека времени выполнения. В состав образца входят клиент и сервер, которые демонстрируют использование этих пользовательских фабрик.
В этом образце служба и клиент являются консольными программами (EXE). Как клиент, так и служба используют общую библиотеку (DLL), которая содержит пользовательский элемент привязки и ассоциированные с ним объекты времени выполнения.
Примечание.
Процедура настройки и инструкции по построению для данного образца приведены в конце этого раздела.
В примере описана рекомендуемая процедура создания пользовательского многоуровневого канала в 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.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".
Первым запустите файл Service.exe, затем Client.exe и наблюдайте результат в обоих окнах консоли.