다음을 통해 공유


사용자 지정 메시지 인터셉터

MessageInterceptor 샘플은 채널 확장성 모델의 사용을 보여 줍니다. 특히 채널 팩터리 및 채널 수신기를 만들어 런타임 스택의 특정 지점에서 들어오고 나가는 모든 메시지를 가로채는 사용자 지정 바인딩 요소를 구현하는 방법을 보여 줍니다. 이 샘플에는 이러한 사용자 지정 팩터리 사용을 보여 주는 클라이언트 및 서버도 포함되어 있습니다.

이 샘플에서 클라이언트와 서비스는 모두 콘솔 프로그램(.exe)입니다. 클라이언트와 서비스는 모두 사용자 지정 바인딩 요소와 연결된 런타임 개체를 포함하는 공용 라이브러리(.dll)를 사용합니다.

비고

이 샘플에 대한 설치 절차 및 빌드 지침은 이 항목의 끝에 있습니다.

이 샘플에서는 채널 프레임워크를 사용하고 WCF 모범 사례를 따라 WCF(Windows Communication Foundation)에서 사용자 지정 계층화된 채널을 만드는 데 권장되는 절차를 설명합니다. 사용자 지정 계층화된 채널을 만드는 단계는 다음과 같습니다.

  1. 채널 팩터리와 채널 수신기가 지원할 채널 셰이프를 결정합니다.

  2. 채널 팩터리 및 채널 셰이프를 지원하는 채널 수신기를 만듭니다.

  3. 사용자 지정 계층화된 채널을 채널 스택에 추가하는 바인딩 요소를 추가합니다.

  4. 새 바인딩 요소를 구성 시스템에 노출하는 바인딩 요소 확장 섹션을 추가합니다.

채널 형상

사용자 지정 계층화된 채널을 작성하는 첫 번째 단계는 채널에 필요한 셰이프를 결정하는 것입니다. 메시지 검사기를 위해 우리는 아래 계층에서 지원하는 모든 셰이프를 지원합니다. 예를 들어, 아래 계층이 IOutputChannelIDuplexSessionChannel을 구축할 수 있다면, 우리는 또한 IOutputChannelIDuplexSessionChannel을 제공합니다.

채널 공장 및 리스너 공장

사용자 지정 계층화된 채널을 작성하는 다음 단계는 클라이언트 채널 및 서비스 채널에 IChannelFactoryIChannelListener 대한 구현을 만드는 것입니다.

이러한 클래스는 내부 팩터리와 수신기를 사용하며, OnCreateChannelOnAcceptChannel 호출을 제외한 모든 호출을 내부 팩터리와 수신기로 위임합니다.

class InterceptingChannelFactory<TChannel> : ChannelFactoryBase<TChannel>
{
    //...
}

class InterceptingChannelListener<TChannel> : ListenerFactoryBase<TChannel>
{
    //...
}

Binding 요소 추가

샘플은 사용자 지정 바인딩 요소를 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 샘플 에 대한One-Time 설정 절차를 수행했는지 확인합니다.

  3. 솔루션을 빌드하려면 Windows Communication Foundation 샘플 빌드의 지침을 따릅니다.

  4. 단일 또는 컴퓨터 간 구성에서 샘플을 실행하려면 Windows Communication Foundation 샘플실행의 지침을 따릅니다.

  5. 먼저 Service.exe 실행한 다음, Client.exe 실행하고 두 콘솔 창에서 출력을 확인합니다.