Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Пример 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
Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.
Чтобы создать решение, следуйте инструкциям по созданию примеров Windows Communication Foundation.
Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в запуска примеров Windows Communication Foundation.
Сначала запустите Service.exe, а затем запустите Client.exe и просмотрите оба окна консоли для выходных данных.