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


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

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

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

Примечание.

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

В примере описана рекомендуемая процедура создания пользовательского многоуровневого канала в 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. InterceptingBindingElementChannelMessageInterceptor принимает входные данные и использует это 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. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

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