Поделиться через


Пользовательский перехватчик сообщений

Данный образец демонстрирует использование модели расширяемости канала. В частности, показано, как реализовать пользовательский элемент привязки, который создает фабрики и прослушиватели каналов для перехвата всех входящих и исходящих сообщений в определенной точке стека времени выполнения. В состав образца входят клиент и сервер, которые демонстрируют использование этих пользовательских фабрик.

В этом образце служба и клиент являются консольными программами (EXE). Как клиент, так и служба используют общую библиотеку (DLL), которая содержит пользовательский элемент привязки и ассоциированные с ним объекты времени выполнения.

ms751495.note(ru-ru,VS.100).gifПримечание
Процедура настройки и инструкции по построению для этого образца приведены в конце этого раздела.

ms751495.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\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. Чтобы создать пользовательский многоуровневый канал, выполните следующие действия.

  1. Выберите формы канала, которые будут поддерживать фабрика и прослушиватель каналов.

  2. Создайте фабрику и прослушиватель каналов, которые поддерживают выбранную форму канала.

  3. Присоедините элемент привязки, добавляющий пользовательский многоуровневый канал в стек каналов.

  4. Добавьте раздел расширения элементов привязки, чтобы представить новый элемент привязки системе конфигурации.

Формы каналов

При создании пользовательского многоуровневого канала в первую очередь необходимо решить, какие формы требуются для канала. Данным инспектором сообщений поддерживается любая форма, поддерживаемая уровнем ниже (например, если уровень ниже может выполнить построение метода 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.

Настройка, построение и выполнение образца

  1. Установите ASP.NET 4.0, выполнив следующую команду.

    %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable
    
  2. Убедитесь, что выполнена процедура, описанная в разделе Процедура однократной настройки образцов Windows Communication Foundation.

  3. Чтобы построить решение, следуйте инструкциям в разделе Построение образцов Windows Communication Foundation.

  4. Чтобы выполнить образец на одном или нескольких компьютерах, следуйте инструкциям раздела Running the Windows Communication Foundation Samples.

  5. Первым запустите файл Service.exe, затем Client.exe и наблюдайте результат в обоих окнах консоли.