2009-08-15 5 views
16

WCF를 사용하여 통신하고 NetDataContractSerializer를 사용하여 개체 그래프를 직렬화하는 클라이언트 - 서버 응용 프로그램이 있습니다. 많은 양의 데이터가 서버와 클라이언트 사이에 전송되기 때문에SOAP 메시지가 아닌 이진 방식으로 WCF 메시지를 serialize하십시오.

는 I은 미세 조정에 의해 데이터 부재의 크기 (예를 들면 등을 int로 길고 짧은하는 int 변경)를 크기를 감소시키는 시도.

튜닝을 마치면 전송 된 데이터의 양이 변경되지 않았 음을 알았습니다!
문제는 NetDataContractSerializer가 개체 그래프를 XML로 직렬화하므로 데이터 멤버의 크기가 무엇이든 문제가되는 것은 그 값의 크기뿐입니다. 예를 들어 Int16 데이터 멤버의 값 10023은 10023 (0x2727) 대신 "10023"(0x3130303233) 문자열로 serialize됩니다.

Remoting에서는 데이터 멤버의 유형에 따라 값을 serialize하는 BinaryFormatter를 사용할 수 있지만 WCF와 함께 사용할 수 있는지 여부는 알 수 없습니다.

누군가 해결책이 있습니까?

답변

35

WCF는 SOAP 메시지를 사용하지만 어떤 종류의 메시지 인코딩이 사용되는지는 전적으로 사용자에게 달려 있습니다.

기본적으로 상자 밖에서는 텍스트 인코딩 (XML 메시지의 텍스트 표현) 또는 이진 인코딩의 두 가지가 있습니다. 꼭해야하고 필요하면 자신의 메시지 인코딩을 작성할 수 있습니다.

기본적으로 basicHttp 및 wsHttp 바인딩은 텍스트 인코딩을 사용하지만 원하는 경우 변경할 수 있습니다. netTcp 바인딩 (기업 방화벽 뒤에서 가장 선호되는 옵션)은 기본적으로 바이너리를 사용합니다.

또한 원하는 경우 (단지 구성에서) 자신의 "바이너리 HTTP"프로토콜을 정의 할 수 있습니다 :

<bindings> 
     <customBinding> 
     <binding name="BinaryHttpBinding"> 
      <binaryMessageEncoding /> 
      <httpTransport /> 
     </binding> 
     </customBinding> 
    </bindings> 

을 다음 서비스와 클라이언트 측 설정에서 사용 :

<services> 
     <service name="YourService"> 
     <endpoint 
      address="http://localhost:8888/YourService/" 
      binding="customBinding" 
      bindingConfiguration="BinaryHttpBinding" 
      contract="IYourService" 
      name="YourService" /> 
     </service> 
    </services> 

이제 http 기반 전송 프로토콜을 사용하여 메시지를 압축 바이너리로 인코딩하여 사용하고 즐기십시오!

코딩이나 지저분한 해킹이 없거나 많은 수작업 XML 직렬화 코드가 필요하지 않습니다. 바로 연결하여 사용하십시오! 아, WCF 유연성의 기쁨!

+0

그래서 무엇입니까? 직렬화 시간이 단축 되었습니까, 아니면 메시지 크기가 줄었습니까? –

+0

이 사용자 지정 바인딩과 명명 된 파이프 전송과 함께 binaryMessageEncoding을 사용했으며 WCF 테스트 클라이언트는 물론 추적 수신기의 메시지 로그에 따라 메시지가 여전히 XML 인코딩입니다. 나는 원시 메시지를 가져 오는 것보다 로그에 객체의 XML 직렬화를 수행하지 않는다고 100 % 확신하지는 않습니다. WCF를 사용하면 원시 요청/응답 대 WebAPI를 쉽게 처리 할 수 ​​있습니다. – AaronLS

+0

이 답변은 도움이 되겠지만 바이너리 인코딩은 메시지가 '유선'으로, 즉 직렬화 된 후 어떻게 전송되는지 만 변경한다는 점에 유의하십시오. 이것은 확실히 데이터 크기를 줄이지 만 직렬화 방법은 변경하지 않습니다. 더 나은 결과를 위해 압축시 이진 인코딩을 사용할 수 있습니다. –

6

첫 번째 생각; 전송 압축을 활성화 했습니까?

데이터는 얼마나 복잡합니까? 정규 DataContractSerializer (즉 간단한 개체 트리)에서 사용할 수있는 항목이면 protobuf-net을 사용할 수 있습니다. 이 서비스 계약에 대한 추가 속성을 통해 WCF를 지원하는 매우 효율적인 바이너리 직렬화 라이브러리입니다 - 예를 들면 :

[ServiceContract] 
public interface IFoo 
{ 
    [OperationContract, ProtoBehavior] 
    Test3 Bar(Test1 value); 
} 

합니다 ([ProtoBehaviour]은이 방법에 대한 다른 직렬로 교체하는 것) 그러나

:

    은 각 속성에 대한 숫자 태그를 식별 할 수 있어야
  • - 하나 추가 속성을 통해, 또는 그것이 [DataMember(Order = x)] 속성에 Order을 사용할 수 있습니다
  • ,
  • 상속 (당신이 그것을 사용하는 경우)

멋지게

  • 당신이 조립 공유를 사용하는 경우 가장 적합한 (를 사랑하지 않는 "MEX는"...), 또한 작동 추가 속성이 필요 MTOM을 사용하여 더 큰 메시지의 기본 64 비용을 줄입니다.

  • 1

    바이너리 인코더는 직렬화와 아무 관련이 없으므로 이진수로 개체를 직렬화하지 않습니다! 하위 계층에서 작동하는 것으로 서버와 클라이언트간에 메시지가 전송되는 방식을 결정합니다.

    즉, 개체는 먼저 DataContractSerializer에 의해 직렬화 된 다음 BinaryEncoder에 의해 인코딩됩니다. 따라서 DataContractSerializer가 포함되어있는 한 객체는 항상 XML 형식이어야합니다. 좀 더 컴팩트 한 데이터와 더 나은 성능을 원하는 경우

    ,이 블로그를 읽어

    여기 https://blogs.msdn.microsoft.com/dmetzgar/2011/03/29/protocol-buffers-and-wcf/

    1

    그것은 주목할 필요가 여기에 지정 인코딩 https://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study

    을 만드는 방법의 예를 실제로 그 무엇 는 기본 인코딩으로 byte []를 전송하는 서비스 메소드가있는 경우와 같습니다. 와이어를 통해 전달되는 메시지는 직렬화 구성 방법에 관계없이 여전히 SOAP XML 봉투를 사용합니다.

    은 다음과 같습니다

    는 바이너리 메시지 인코딩 상당한 성능 향상을 제공
    POST http://127.0.0.1:12345/forSwerGup182948/Client HTTP/1.1 
    Content-Type: text/xml; charset=utf-8 
    VsDebuggerCausalityData: uIDPo+WkoDpet/JOtGlW+EHdpDQAAAAAvFs5XOJ0tEW0wTvNVRDUIiabR6u+p+JNnd5Z+SWl1NcACQAA 
    SOAPAction: "http://tempuri.org/ITransmissionService/SendData" 
    Host: 127.0.0.1:12345 
    Expect: 100-continue 
    Accept-Encoding: gzip, deflate 
    Content-Length: 2890 
    
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><SendData xmlns="http://tempuri.org/"><message>eyI8Q2FsbGJhY2tJZD5rX19CYWNraW5nRmllbGQiOiJlYTQ3ZWIzMS1iYjIzLTRkODItODljNS1hNTZmNjdiYmQ4MTQiLCI8RnJvbT5rX19CYWNraW5nRmllbGQiOnsiPENoYW5uZWxOYW1lPmtfX0JhY2tpbmdGaWVsZCI6Ikdyb3VwMSIsIjxOYW1lPmtfX0==</message></SendData></s:Body></s:Envelope> 
    
    관련 문제