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


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

Пример 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 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. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

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

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

  5. Сначала запустите Service.exe, а затем запустите Client.exe и просмотрите оба окна консоли для выходных данных.