다음을 통해 공유


메시지 인코더 선택

이 문서에서는 WCF(Windows Communication Foundation)에 포함된 메시지 인코더 중에서 이진, 텍스트 및 MTOM(메시지 전송 최적화 메커니즘)을 선택하는 기준에 대해 설명합니다.

WCF에서는 바인딩 요소 시퀀스로 구성된 바인딩을 통해 엔드포인트 간에 네트워크를 통해 데이터를 전송하는 방법을 지정 합니다. 메시지 인코더는 바인딩 스택의 메시지 인코딩 바인딩 요소로 표시됩니다. 바인딩에는 보안 바인딩 요소 또는 신뢰할 수 있는 메시징 바인딩 요소, 필수 메시지 인코딩 바인딩 요소 및 필수 전송 바인딩 요소와 같은 선택적 프로토콜 바인딩 요소가 포함됩니다.

메시지 인코딩 바인딩 요소는 선택적 프로토콜 바인딩 요소 아래와 필요한 전송 바인딩 요소 위에 있습니다. 발신 쪽에서 메시지 인코더는 발신 Message을 직렬화하고 이를 전송 수단에 전달합니다. 들어오는 쪽에서 메시지 인코더는 전송에서 직렬화된 형식을 Message 수신하고 더 높은 프로토콜 계층(있는 경우) 또는 애플리케이션에 전달합니다(그렇지 않은 경우).

기존 클라이언트 또는 서버에 연결할 때 다른 쪽에서 예상하는 방식으로 메시지를 인코딩해야 하므로 특정 메시지 인코딩을 사용할 수 없습니다. 그러나 WCF 서비스를 작성하는 경우 각각 다른 메시지 인코딩을 사용하여 여러 엔드포인트를 통해 서비스를 노출할 수 있습니다. 이렇게 하면 클라이언트가 가장 적합한 엔드포인트를 통해 서비스와 통신하는 데 가장 적합한 인코딩을 선택할 수 있으며 클라이언트에게 가장 적합한 인코딩을 선택할 수 있는 유연성을 제공할 수 있습니다. 또한 여러 엔드포인트를 사용하면 다른 메시지 인코딩의 장점을 다른 바인딩 요소와 결합할 수 있습니다.

System-Provided 인코더

WCF에는 다음 세 가지 클래스로 표시되는 세 개의 메시지 인코더가 포함되어 있습니다.

  • TextMessageEncodingBindingElement텍스트 메시지 인코더는 일반 XML 인코딩과 SOAP 인코딩을 모두 지원합니다. 텍스트 메시지 인코더의 일반 XML 인코딩 모드를 텍스트 기반 SOAP 인코딩과 구분하기 위해 "일반 이전 XML"(POX)이라고 합니다. POX를 사용하도록 설정하려면 속성을 MessageVersion.로 설정합니다None. 문자 메시지 인코더를 사용하여 비 WCF 엔드포인트와 상호 운용합니다.

  • BinaryMessageEncodingBindingElement이진 메시지 인코더는 컴팩트한 이진 형식을 사용하며 WCF에서 WCF 통신으로 최적화되므로 상호 운용할 수 없습니다. 이는 WCF에서 제공하는 모든 인코더 중 가장 성능이 좋은 인코더이기도 합니다.

  • MtomMessageEncodingBindingElement바인딩 요소인 경우 MTOM 인코딩을 사용하여 메시지에 대한 문자 인코딩 및 메시지 버전 관리를 지정합니다. MTOM은 WCF 메시지에서 이진 데이터를 전송하기 위한 효율적인 기술입니다. MTOM 인코더는 효율성과 상호 운용성 간의 균형을 만들려고 합니다. MTOM 인코딩은 대부분의 XML을 텍스트 형식으로 전송하지만 텍스트로 변환하지 않고 as-is전송하여 이진 데이터의 큰 블록을 최적화합니다. 효율성 측면에서 WCF가 제공하는 인코더 중 MTOM은 텍스트(가장 느린) 및 이진(가장 빠른) 사이의 인코더입니다.

메시지 인코더를 선택하는 방법

다음 표에서는 메시지 인코더를 선택하는 데 사용되는 일반적인 요인에 대해 설명합니다. 애플리케이션에 중요한 요소의 우선 순위를 지정한 다음 이러한 요소에 가장 적합한 메시지 인코더를 선택합니다. 이 테이블에 나열되지 않은 추가 요소와 애플리케이션에 필요할 수 있는 사용자 지정 메시지 인코더를 고려해야 합니다.

요인 설명 이 요소를 지원하는 인코더
지원되는 문자 집합 TextMessageEncodingBindingElement UTF8 MtomMessageEncodingBindingElement 및 UTF16 유니코드(big-endianlittle-endian) 인코딩만 지원합니다. UTF7 또는 ASCII와 같은 다른 인코딩이 필요한 경우 사용자 지정 인코더를 사용해야 합니다. 샘플 사용자 지정 인코더는 사용자 지정 메시지 인코더를 참조하세요. 문자 메시지
검사 검사는 전송 중에 메시지를 검사하는 기능입니다. SOAP를 사용하거나 사용하지 않는 텍스트 인코딩을 사용하면 특수 도구를 사용하지 않고도 많은 애플리케이션에서 메시지를 검사하고 분석할 수 있습니다. 메시지 또는 전송 수준에서 전송 보안을 사용하면 메시지를 검사하는 기능에 영향을 줍니다. 기밀성은 메시지가 검사되지 않도록 보호하고 무결성은 메시지가 수정되지 않도록 보호합니다. 문자 메시지
신뢰도 안정성은 전송 오류에 대한 인코더의 복원력입니다. 메시지, 전송 또는 애플리케이션 계층에서도 안정성을 제공할 수 있습니다. 모든 표준 WCF 인코더는 다른 계층이 안정성을 제공하고 있다고 가정합니다. 인코더는 전송 오류에서 복구할 수 있는 기능이 거의 없습니다. 없음
단순 단순성은 인코딩 사양에 대한 인코더 및 디코더를 만들 수 있는 용이성을 나타냅니다. 텍스트 인코딩은 단순성을 위해 특히 유리하며 POX 텍스트 인코딩은 SOAP 처리를 지원하지 않아도 되는 추가적인 이점이 있습니다. 텍스트(POX)
크기 인코딩은 콘텐츠에 적용되는 오버헤드의 양을 결정합니다. 인코딩된 메시지의 크기는 서비스 작업의 최대 처리량과 직접 관련이 있습니다. 이진 인코딩은 일반적으로 텍스트 인코딩보다 더 컴팩트합니다. 메시지 크기가 프리미엄인 경우 인코딩하는 동안 메시지 내용도 압축하는 것이 좋습니다. 그러나 압축은 메시지 발신자와 수신자 모두에 대한 처리 비용을 추가합니다. 바이너리
스트리밍 스트리밍을 사용하면 전체 메시지가 도착하기 전에 애플리케이션에서 메시지 처리를 시작할 수 있습니다. 효과적으로 스트리밍을 사용하려면 수신 애플리케이션이 도착할 때까지 기다릴 필요가 없도록 메시지의 시작 부분에 메시지의 중요한 데이터를 사용할 수 있어야 합니다. 또한 스트리밍 전송을 사용하는 애플리케이션은 콘텐츠에 전달 종속성이 없도록 메시지의 데이터를 증분 방식으로 구성해야 합니다. 대부분의 경우 스트리밍 콘텐츠와 해당 콘텐츠에 대해 가능한 가장 작은 전송 크기 간에 타협해야 합니다. 없음
타사 도구 지원 인코딩 지원 영역에는 개발 및 진단이 포함됩니다. 타사 개발자는 POX 형식으로 인코딩된 메시지를 처리하기 위해 라이브러리 및 도구 키트에 많은 투자를 했습니다. 텍스트(POX)
상호 운용성 이 요소는 WCF 인코더가 WCF가 아닌 서비스와 상호 운용하는 기능을 나타냅니다. 문자 메시지

MTOM(부분)

참고: 이진 인코더를 사용하는 경우 XMLReader를 만들 때 IgnoreWhitespace 설정을 사용하면 효과가 없습니다. 예를 들어 서비스 작업 내에서 다음을 수행하는 경우:

public void OperationContract(XElement input)
{
    Console.WriteLine("{0}", input.Value);
    int counter = 0;
    var xreader = input.CreateReader();
    var reader = XmlReader.Create(xreader, new XmlReaderSettings() { IgnoreWhitespace = true });
    while (reader.Read())
    {
        counter++;
    }

    Console.WriteLine("Read {0} lines with reader", counter);
}

IgnoreWhitespace 설정은 무시됩니다.

압축 및 이진 인코더

WCF 4.5부터 WCF 이진 인코더는 압축에 대한 지원을 추가합니다. 이렇게 하면 gzip/deflate 알고리즘을 사용하여 WCF 클라이언트에서 압축된 메시지를 보내고 자체 호스팅 WCF 서비스에서 압축된 메시지로 응답할 수도 있습니다. 이 기능을 사용하면 HTTP 및 TCP 전송 모두에서 압축할 수 있습니다. IIS 호스트 서버를 구성하여 압축된 응답을 보내기 위해 IIS 호스팅 WCF 서비스를 항상 사용하도록 설정할 수 있습니다. 압축 유형은 속성으로 구성됩니다 BinaryMessageEncodingBindingElement.CompressionFormat . 이 속성은 열거형 값 중 System.ServiceModel.Channels.CompressionFormat 하나로 설정됩니다.

이 속성은 binaryMessageEncodingBindingElement에만 노출되므로 이 기능을 사용하려면 다음과 같은 사용자 지정 바인딩을 만들어야 합니다.

<customBinding>
  <binding name="BinaryCompressionBinding">
    <binaryMessageEncoding compressionFormat ="GZip" />
    <httpTransport />
 </binding>
</customBinding>

클라이언트와 서비스 모두 압축 메시지를 보내고 받는 데 동의해야 하므로 compressionFormat 속성은 클라이언트와 서비스 모두의 binaryMessageEncoding 요소에서 구성되어야 합니다. 서비스 또는 클라이언트 중 하나는 압축을 위해 구성되어 있지만, 다른 쪽은 구성되어 있지 않은 경우 ProtocolException이 throw됩니다. 압축을 사용하도록 설정하는 것은 신중하게 고려해야 합니다. 압축은 네트워크 대역폭이 병목 상태인 경우 주로 유용합니다. CPU가 병목 상태인 경우 압축은 처리량을 감소합니다. 애플리케이션에 이점이 있는지 확인하려면 시뮬레이션된 환경에서 적절한 테스트를 수행해야 합니다.

참고하십시오