Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Пример 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 и просмотрите оба окна консоли для выходных данных.