다음을 통해 공유


사용자 지정 인코더

이 항목에서는 사용자 지정 인코더를 만드는 방법에 대해 설명합니다.

WCF(Windows Communication Foundation)에서는 바인딩 을 사용하여 엔드포인트 간에 네트워크를 통해 데이터를 전송하는 방법을 지정합니다. 바인딩은 바인딩 요소 시퀀스로 구성됩니다. 바인딩에는 보안, 필수 메시지 인코더 바인딩 요소 및 필수 전송 바인딩 요소와 같은 선택적 프로토콜 바인딩 요소가 포함됩니다. 메시지 인코더는 메시지 인코딩 바인딩 요소로 표시됩니다. WCF에는 이진, MTOM(메시지 전송 최적화 메커니즘) 및 텍스트의 세 가지 메시지 인코더가 포함되어 있습니다.

메시지 인코딩 바인딩 요소는 발신 Message 을 직렬화하고 전송에 전달하거나 전송에서 직렬화된 메시지 형식을 수신하여 프로토콜 계층(있는 경우) 또는 애플리케이션에 전달합니다(없는 경우).

메시지 인코더는 Message 인스턴스를 유선 표현으로 변환하고, 그 반대로도 변환합니다. 인코더는 채널 스택의 전송 계층 위에 있는 것으로 설명되지만 전송 계층 내에 상주합니다. 전송(예: HTTP)은 전송 표준의 요구 사항에 따라 메시지의 형식을 지정합니다. 인코더(예: Text Xml)는 메시지를 인코딩하기만 하면 됩니다.

기존 클라이언트 또는 서버에 연결할 때 특정 메시지 인코딩을 사용할 수 없습니다. 그러나 WCF 서비스는 각각 다른 메시지 인코더가 있는 여러 엔드포인트를 통해 액세스할 수 있습니다. 단일 인코더가 서비스에 대한 전체 대상을 다루지 않는 경우 여러 엔드포인트를 통해 서비스를 노출하는 것이 좋습니다. 그러면 클라이언트 애플리케이션이 가장 적합한 엔드포인트를 선택할 수 있습니다. 여러 엔드포인트를 사용하면 다른 메시지 인코더의 장점을 다른 바인딩 요소와 결합할 수 있습니다.

System-Provided 인코더

WCF는 가장 일반적인 애플리케이션 시나리오를 포함하도록 설계된 여러 시스템 제공 바인딩을 제공합니다. 이러한 각 바인딩은 전송, 메시지 인코더 및 기타 옵션(예: 보안)을 결합합니다. 이 항목에서는 WCF에 포함된 Text, Binary, MTOM 메시지 인코더를 확장하거나 사용자 지정 인코더를 만드는 방법을 설명합니다. 문자 메시지 인코더는 일반 XML 인코딩과 SOAP 인코딩을 모두 지원합니다. 텍스트 메시지 인코더의 일반 XML 인코딩 모드를 텍스트 기반 SOAP 인코딩과 구분하기 위해 POX("일반 이전 XML") 인코더라고 합니다.

시스템 제공 바인딩에서 제공하는 바인딩 요소의 조합에 대한 자세한 내용은 전송 선택에서 해당 섹션을 참조하세요.

System-Provided 인코더를 사용하여 작업하는 방법

MessageEncodingBindingElement에서 파생된 클래스를 사용하여 바인딩에 인코딩이 추가됩니다.

WCF는 텍스트, 이진 및 MTOM(메시지 전송 최적화 메커니즘) 인코딩을 제공할 수 있는 클래스에서 MessageEncodingBindingElement 파생된 다음과 같은 유형의 바인딩 요소를 제공합니다.

  • TextMessageEncodingBindingElement: XML 메시지에 대해 가장 상호 운용 가능하지만 가장 비효율적인 인코더입니다. 웹 서비스 또는 웹 서비스 클라이언트는 일반적으로 텍스트 XML을 이해할 수 있습니다. 그러나 큰 블록의 이진 데이터를 텍스트로 전송하는 것은 효율적이지 않습니다.

  • BinaryMessageEncodingBindingElement: 이진 기반 XML 메시지에 사용되는 문자 인코딩 및 메시지 버전 관리를 지정하는 바인딩 요소를 나타냅니다. 이는 WCF 엔드포인트에서만 지원되기 때문에 인코딩 옵션 중 가장 효율적이지만 상호 운용성이 가장 낮은 옵션입니다.

  • MtomMessageEncodingBindingElement: MTOM(메시지 전송 최적화 메커니즘) 인코딩을 사용하여 메시지에 사용되는 문자 인코딩 및 메시지 버전 관리를 지정하는 바인딩 요소를 나타냅니다. MTOM은 WCF 메시지에서 이진 데이터를 전송하기 위한 효율적인 기술입니다. MTOM 인코더는 효율성과 상호 운용성 간의 균형을 맞추려고 합니다. MTOM 인코딩은 대부분의 XML을 텍스트 형식으로 전송하지만 텍스트로 변환하지 않고 as-is전송하여 이진 데이터의 큰 블록을 최적화합니다.

바인딩 요소는 이진, MTOM 또는 텍스트를 MessageEncoderFactory만듭니다. 팩터리는 이진, MTOM 또는 텍스트 MessageEncoderFactory 인스턴스를 만듭니다. 일반적으로 단일 인스턴스만 있습니다. 그러나 세션이 사용되는 경우 각 세션에 다른 인코더를 제공할 수 있습니다. 이진 인코더는 이를 사용하여 동적 사전을 조정합니다(XML 인프라 참조).

ReadMessageWriteMessage 메서드는 인코더의 핵심입니다. 메서드는 스트림 또는 Byte 배열에서 메시지를 읽는 기능을 제공합니다. 바이트 배열은 전송이 버퍼링 모드에서 작동할 때 사용됩니다. 메시지는 항상 스트림에 기록됩니다. 전송에서 메시지를 버퍼링해야 하는 경우 버퍼링을 수행하는 스트림을 제공합니다.

팀의 나머지 구성원은 지원 콘텐츠, 미디어 형식 및 MessageVersion으로 작업합니다. 전송은 이러한 인코더 메서드를 호출하여 들어오는 메시지를 디코딩할 수 있는지 여부를 테스트하거나 보내는 메시지가 이 인코더에 유효한지 확인합니다.

세 인코더 구현 각각은 특정 인코딩과 관련되고 완전히 구성할 수 있는 속성을 추가합니다. 또한 인코더는 보안 기본값이 있는 판독기 할당량을 노출합니다. 할당량에 대한 자세한 내용은 XML 인프라를 참조하세요.

System-Provided 인코더의 기능

시스템 제공 인코더에서 제공하는 다양한 기능이 있습니다.

자원 결합

각 인코더 구현은 가능한 한 많이 풀링하려고 합니다. 할당을 줄이는 것은 관리 코드의 성능을 향상시키는 주요 방법입니다. 이 풀링을 수행하기 위해 구현은 클래스를 SynchronizedPool 사용합니다. C# 파일에는 이 클래스에서 사용하는 추가 최적화에 대한 설명이 포함되어 있습니다.

XmlDictionaryReaderXmlDictionaryWriter 메시지에 대해 새 인스턴스를 할당하지 않도록 인스턴스가 풀링되고 다시 초기화됩니다. 독자를 위해, OnClose 콜백은 Close()가 호출될 때 독자를 다시 가져옵니다. 또한 인코더는 메시지를 생성할 때 사용되는 일부 메시지 상태 개체를 재활용합니다. 이러한 풀의 크기는 각각에서 파생된 MaxReadPoolSize세 클래스의 MaxWritePoolSize 속성 및 MessageEncodingBindingElement 속성을 통해 구성할 수 있습니다.

이진 인코딩

이진 인코딩이 세션을 사용하는 경우 동적 사전 문자열을 메시지 수신자에게 전달해야 합니다. 이 작업은 동적 사전 문자열을 사용하여 메시지 접두사를 지정하여 수행됩니다. 수신기는 문자열을 제거하고 세션에 추가하고 메시지를 처리합니다. 사전 문자열을 올바르게 전달하려면 전송을 버퍼링해야 합니다.

문자열은 내부 AddSessionInformationToMessage 메서드에 의해 메시지에 추가됩니다. 메시지 앞부분에 문자열의 길이를 접두사로 포함하여 UTF-8로 문자열을 추가합니다. 그런 다음 전체 사전 헤더에 데이터 길이가 접두사로 추가됩니다. 역방향 작업은 내부 ExtractSessionInformationFromMessage 메서드에 의해 수행됩니다.

동적 사전 키를 처리하는 것 외에도 버퍼링된 세션 메시지는 고유한 방식으로 수신됩니다. 이진 인코더는 문서를 통해 판독기를 만들고 처리하는 대신 내부 MessagePatterns 클래스를 사용하여 이진 스트림을 분해합니다. 대부분의 메시지에는 WCF에서 생성할 때 특정 순서로 표시되는 특정 헤더 집합이 있습니다. 패턴 시스템은 예상한 내용에 따라 메시지를 분리합니다. 성공하면 XML 파일을 분석하지 않고 MessageHeaders 객체를 초기화합니다. 그렇지 않은 경우 표준 메서드로 돌아갑니다.

MTOM 인코딩

클래스에는 MtomMessageEncodingBindingElement .라는 추가 구성 속성이 있습니다 MaxBufferSize. 이렇게 하면 메시지를 읽는 동안 버퍼링할 수 있는 데이터의 양에 상한이 배치됩니다. 모든 MIME 부분을 단일 메시지로 재조립하려면 XML 정보 집합(Infoset) 또는 기타 MIME 부분을 버퍼링해야 할 수 있습니다.

HTTP에서 올바르게 작동하려면 내부 MTOM 메시지 인코더 클래스가 일부 내부 API를 제공해야 합니다. 이는 GetContentType와 같은 내부 API뿐만 아니라 공용으로 제공되며 재정의할 수 있는 WriteMessage에도 해당됩니다. HTTP 헤더의 값이 MIME 헤더의 값에 동의하도록 하려면 더 많은 통신이 이뤄져야 합니다.

내부적으로 MTOM 메시지 인코더는 WCF의 텍스트 판독기를 사용하며 텍스트 인코더와 비슷합니다. 주요 차이점은 메시지 바이트에 포함되기 전에 Base-64 인코딩으로 변환하지 않고 이진 대량 객체("Binary Large Objects", BLOB)의 대량의 데이터를 최적화한다는 점입니다. 대신 이러한 BLOB은 추출된 상태로 유지되고 MIME 첨부 파일로 참조됩니다.

사용자 고유의 인코더 작성

사용자 고유의 사용자 지정 메시지 인코더를 구현하려면 다음 추상 기본 클래스의 사용자 지정 구현을 제공해야 합니다.

메시지의 메모리 내 표현에서 스트림에 쓸 수 있는 표현으로 변환하는 작업은 특정 유형의 XML 인코딩을 지원하는 XML 판독기 및 XML 작성기의 팩터리 역할을 하는 클래스 내에 MessageEncoder 캡슐화됩니다.

이 코드는 표준 전송 프로토콜과 사용자 지정된 인코딩 간의 변환을 처리하는 이러한 메서드에서 작성하는 코드입니다.

다음으로 사용자 지정 인코더를 만드는 팩터리 클래스를 코딩해야 합니다. Encoder을 재정의하여 사용자 지정 인스턴스를 반환하도록 MessageEncoder를 처리합니다.

그런 다음, MessageEncoderFactory 메서드를 재정의하여 이 팩터리의 인스턴스를 반환함으로써 서비스 또는 클라이언트를 구성하는 데 사용되는 바인딩 요소 스택에 사용자 지정 CreateMessageEncoderFactory 을 연결합니다.

샘플 코드로 이 프로세스를 설명하는 WCF와 함께 제공되는 두 가지 샘플이 있습니다. 사용자 지정 메시지 인코더: 사용자 지정 텍스트 인코더사용자 지정 메시지 인코더: 압축 인코더.

참고하십시오