2009-08-28 3 views
1

내 프로젝트에 netTCP WCF 서비스가 있습니다.WCF로 전선을 통해 최소량의 데이터 전송

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.serviceModel> 
     <bindings> 
      <netTcpBinding> 
       <binding name="NetTcpBinding_IIndexer" closeTimeout="00:01:00" 
        openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
        transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
        hostNameComparisonMode="StrongWildcard" listenBacklog="10" 
        maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10" 
        maxReceivedMessageSize="65536"> 
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
         maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
        <reliableSession ordered="true" inactivityTimeout="00:10:00" 
         enabled="false" /> 
        <security mode="None"> 
         <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
         <message clientCredentialType="Windows" /> 
        </security> 
       </binding> 
      </netTcpBinding> 
     </bindings> 
     <client> 
      <endpoint address="net.tcp://mach1:9000/Indexer" binding="netTcpBinding" 
       bindingConfiguration="NetTcpBinding_IIndexer" contract="in.IIndexer" 
       name="NetTcpBinding_IIndexer" /> 
     </client> 
    </system.serviceModel> 
</configuration> 

와이어를 통해 전송되는 데이터의 압축을 최대화하기 위해 할 수있는 일이 있습니까 : 이것에 대한의 app.config은? 내 프로젝트는 내부적이므로 속도와 처리 능력은 근본적으로 문제가되지 않습니다.

클라이언트에서 WCF 서비스로 보낸 데이터를 압축하는 데 유용한 팁과 트릭은 무엇입니까?

답변

8

바인딩에 의해 지정된 메시지 인코딩은 데이터가 와이어에서 바이트로 변환되는 방식을 결정합니다. NetTcpBinding의 경우 자동으로 바이너리 인코딩을 사용하여 모든 기본 제공 WCF 인코더에서 메시지를 가장 간단하게 표현할 수 있습니다.

자세한 내용은, 나는이 자료를 추천 할 것입니다 :

  1. Zulfiqar 아메드 : SOAP message size optimization: Encoding vs compression
  2. 케니 늑대 : Performance Characteristics of WCF Encoders
  3. MSDN을 : Choosing a Message Encoder
+1

내장 WCF 인코더가 있지만 TCP를 사용하고 있으며 실제 압축을 지원하지는 않습니다. –

+0

첫 번째 링크가 깨졌습니다 :(그것을 고쳐주세요 –

2

전송할 데이터 종류에 따라 다르지만 직렬화를 사용하여 데이터를 만든 경우 XML로 직렬화하고 GZipStream으로 압축하면 생성 된 데이터를 압축하는 것보다 적은 바이트가 발생할 수 있습니다. 이진 직렬화.

+0

그래서 여기서는 혼란스러워합니다. 직렬화를 설정하지 않았으므로 기본 클래스 또는 사용자 정의 클래스 배열을 전송 중입니다. 사용자 지정 클래스는 ISerializable을 상속하지 않으며 [Serialized] 특성으로 표시되어 있지 않습니다. 내가 한 모든 작업은 [datamember] 속성을 가진 모든 사용자 정의 클래스의 공용 속성을 표시하는 것입니다. 그 외에는 다른 일은 없었습니다. 그래서 나는 내가 가진 것을 정말로 모른다. :-( – Matt

+0

오, 그럼, 당신은 실제로 무엇을 운반 할지를 제어하지 못합니다. 당신은 WCF 스트림 컨트롤을 보면서 당신이 추가 할 수있는 컴 프레 션을 볼 수 있습니다. (나는 이것을하지 않았습니다.) 또는 실제 객체의 이동을 멈출 수 있습니다 실제 개체로 또는 개체에서 변환 된 압축 된 BLOB를 전송하도록 계약을 변경합니다. –

+1

TCP를 통한 WCF 압축 및 http://www.noemax.com의 압축 기능의 존재에 대한 정보를 찾는 어려움을 기반으로합니다. /products/wcfx/features.html 코드를 작성하거나 제 3 자 압축 기능을 구입해야 할 것으로 의심됩니다. –

2

나는이 모든 것을 함께 처리하려고 노력하고 있지만 DataContractAttribute를 사용할 때는 DataContract serialization을 사용한다는 것을 알고 있습니다. 이 serialization 체계와 Serializable 체계의 차이점에 대해서는 명확하지 않지만, 수집 할 수 있었던 것부터는 다르다.

여기에있는 중재자 중 한 명인 Marc Gravell이이 문제에 대해 조사한 전문가입니다. 그는 실제로 here을 사용할 수있는 protobuf-net이라는 직렬화 체계를 가지고 있습니다.

+1

학습 곡선이 가파른 이유는 다음과 같습니다 .-) – Matt

0
  1. 를 사용하여 압축을 .. 4.5에서

    <binaryMessageEncoding compressionFormat="GZip"/> 
    
        <tcpTransport maxReceivedMessageSize="20000000"/> 
    </binding> 
    

  2. 네임 스페이스를 설정 네임 스페이스를 사용하지 마십시오

  3. ""(및 서비스 계약에뿐만 아니라.) [DataContract (네임 스페이스 = "")] 공용 클래스 AddDeckMessage

  4. (인터페이스/기본 클래스를 XML로 보내는 경우) 드물게 XML은 이해하지 못하고 Microsoft Explcit XML을 추가합니다. 당신은 와이어에 사용자 정의 할 수 있습니다 knowntype 사용 일반 DTO들을 ... 사용하지 마십시오 사용 EmitDefaultValue

  5. 비의 TCP 압축 바이트 []에주의하십시오. 123로 표시되면 인코딩에 따라 각 바이트에 대해 15-30 바이트가 표시됩니다. 표준 WS 프로토콜을 사용해야하는 경우 uuencode를 사용하십시오.