다음을 통해 공유


사용자 지정 스트림 업그레이드

TCP 및 명명된 파이프와 같은 스트림 지향 전송은 클라이언트와 서버 간의 연속 바이트 스트림에서 작동합니다. 이 스트림은 Stream 개체에 의해 구현됩니다. 스트림 업그레이드에서 클라이언트는 선택적 프로토콜 계층을 채널 스택에 추가하려고 하고 통신 채널의 다른 쪽 끝에 이를 요청합니다. 스트림 업그레이드는 원래 Stream 개체를 업그레이드된 개체로 바꾸는 것으로 구성됩니다.

예를 들어 전송 스트림 위에 직접 압축 스트림을 빌드할 수 있습니다. 이 경우 원래 전송 Stream은 압축 Stream을 덧붙여 원래 전송을 감싸는 것으로 교체됩니다.

여러 스트림 업그레이드를 적용할 수 있으며 각 업그레이드는 앞의 업그레이드를 래핑합니다.

스트림 업그레이드 작동 방식

스트림 업그레이드 프로세스에는 네 가지 구성 요소가 있습니다.

  1. 업그레이드 스트림 초기자는 프로세스를 시작합니다. 런타임에 채널 전송 계층을 업그레이드하기 위해 연결의 다른 쪽 끝에 대한 요청을 시작할 수 있습니다.

  2. 업그레이드 스트림 Acceptor 는 업그레이드를 수행합니다. 런타임에 다른 컴퓨터에서 업그레이드 요청을 수신하고 가능하면 업그레이드를 수락합니다.

  3. 업그레이드 공급자는 클라이언트에 Initiator를 만들고 서버에 Acceptor를 만듭니다.

  4. 스트림 업그레이드 바인딩 요소는 서비스 및 클라이언트의 바인딩에 추가되어, 런타임에 공급자를 생성합니다.

여러 업그레이드의 경우, 발신자 및 수신자는 각각의 초기화에 대해 유효한 업그레이드 전환을 적용하기 위해 상태 기계를 캡슐화합니다.

스트림 업그레이드를 구현하는 방법

WCF(Windows Communication Foundation)는 구현할 수 있는 네 abstract 가지 클래스를 제공합니다.

사용자 지정 스트림 업그레이드를 구현하려면 다음을 수행합니다. 이 절차는 클라이언트 및 서버 컴퓨터 모두에서 최소 스트림 업그레이드 프로세스를 구현합니다.

  1. StreamUpgradeInitiator를 구현하는 클래스를 만듭니다.

    1. 업그레이드할 스트림을 받도록 메서드 InitiateUpgrade를 재정의하고, 업그레이드된 스트림을 반환합니다. 이 메서드는 동기적으로 작동합니다. 업그레이드를 비동기적으로 시작하는 유사한 메서드가 있습니다.

    2. GetNextUpgrade 메서드를 재정의하여 추가 업그레이드를 확인합니다.

  2. StreamUpgradeAcceptor를 구현하는 클래스를 만듭니다.

    1. 업그레이드할 스트림을 받도록 메서드 AcceptUpgrade를 재정의하고, 업그레이드된 스트림을 반환합니다. 이 메서드는 동기적으로 작동합니다. 업그레이드를 비동기적으로 수락하는 유사한 메서드가 있습니다.

    2. 업그레이드 프로세스의 CanUpgrade 이 시점에서 이 업그레이드 수락자가 요청한 업그레이드를 지원하는지 확인하려면 메서드를 재정의합니다.

  3. 구현하는 클래스를 만듭니다.StreamUpgradeProvider CreateUpgradeAcceptorCreateUpgradeInitiator 메서드를 재정의하여 2단계와 1단계에서 정의된 수락자와 개시자의 인스턴스를 반환합니다.

  4. StreamUpgradeBindingElement를 구현하는 클래스를 만듭니다.

    1. 클라이언트의 BuildClientStreamUpgradeProvider 메서드와 서비스의 BuildServerStreamUpgradeProvider 메서드를 재정의합니다.

    2. 클라이언트의 BuildChannelFactory 메서드와 서비스의 BuildChannelListener 메서드를 재정의하여 BindingParameters에 업그레이드 바인딩 요소를 추가합니다.

  5. 서버 및 클라이언트 컴퓨터의 바인딩에 새 스트림 업그레이드 바인딩 요소를 추가합니다.

보안 업그레이드

보안 업그레이드를 추가하는 것은 일반 스트림 업그레이드 프로세스의 특수 버전입니다.

WCF는 스트림 보안을 업그레이드하기 위한 두 가지 바인딩 요소를 이미 제공합니다. 전송 수준 보안의 구성은 WindowsStreamSecurityBindingElementSslStreamSecurityBindingElement에 의해 캡슐화되며, 이들은 구성되어 사용자 지정 바인딩에 추가될 수 있습니다. 이러한 바인딩 요소는 클라이언트 및 서버 스트림 업그레이드 공급자를 빌드하는 클래스를 확장 StreamUpgradeBindingElement 합니다. 이러한 바인딩 요소에는 특수한 보안 스트림 업그레이드 공급자 클래스를 생성하는 메서드가 있으며, 이러한 클래스는 public와 같지 않으므로, 이 두 경우에는 바인딩 요소를 바인딩에 추가하기만 하면 됩니다.

위의 두 바인딩 요소에서 충족되지 않는 보안 시나리오의 경우 위의 초기자, 수락자 및 공급자 기본 클래스에서 세 가지 보안 관련 abstract 클래스가 파생됩니다.

  1. System.ServiceModel.Channels.StreamSecurityUpgradeInitiator

  2. System.ServiceModel.Channels.StreamSecurityUpgradeAcceptor

  3. System.ServiceModel.Channels.StreamSecurityUpgradeProvider

보안 스트림 업그레이드를 구현하는 프로세스는 이전과 동일하며, 이러한 세 클래스에서 파생되는 차이점이 있습니다. 런타임에 보안 정보를 제공하려면 이러한 클래스의 추가 속성을 재정의합니다.

여러 업그레이드

추가 업그레이드 요청을 만들려면 위의 프로세스를 반복합니다. StreamUpgradeProvider 추가 확장 및 바인딩 요소를 만듭니다. 바인딩에 바인딩 요소를 추가합니다. 추가 바인딩 요소는 바인딩에 추가된 첫 번째 바인딩 요소부터 순차적으로 처리됩니다. 각 업그레이드 공급자는 BuildChannelFactoryBuildChannelListener를 사용하여 기존 업그레이드 바인딩 매개 변수에 어떻게 계층을 쌓을지 결정할 수 있습니다. 그런 다음 기존 업그레이드 바인딩 매개 변수를 새 복합 업그레이드 바인딩 매개 변수로 바꿔야 합니다.

또는 하나의 업그레이드 공급자가 여러 업그레이드를 지원할 수 있습니다. 예를 들어 보안 및 압축을 모두 지원하는 사용자 지정 스트림 업그레이드 공급자를 구현할 수 있습니다. 다음 단계를 수행합니다.

  1. Subclass StreamSecurityUpgradeProvider를 이용하여 초기자 및 Acceptor를 생성하는 공급자 클래스를 작성하십시오.

  2. 서브클래스 StreamSecurityUpgradeInitiator를 작성하여 압축 스트림과 보안 스트림의 콘텐츠 형식을 순서대로 반환하기 위해 GetNextUpgrade 메서드를 재정의해야 합니다.

  3. 메서드의 StreamSecurityUpgradeAcceptor 사용자 지정 콘텐츠 형식 CanUpgrade 을 이해하는 서브클래스입니다.

  4. 스트림은 GetNextUpgradeCanUpgrade 호출이 있을 때마다 업그레이드됩니다.

참고하십시오