简体   繁体   中英

Transmitting the least amount of data over the wire with WCF

My project has a netTCP WCF service. This is the app.config for it:

<?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>

Is there any thing that can be done to maximize the compression of the data being sent over the wire? My project is internal so speed and processing power are essentially of no issue.

What are some good tips and tricks to compress the data sent from the client to the WCF service?

The message encoding specified by the binding will determine how your data gets turned into bytes on the wire. For the NetTcpBinding, it will automatically use binary encoding which gives you the most compact representation of your message out of all the built-in WCF encoders.

For more information, I would recommend these resources:

  1. Zulfiqar Ahmed: SOAP message size optimization: Encoding vs compression
  2. Kenny Wolf: Performance Characteristics of WCF Encoders
  3. MSDN: Choosing a Message Encoder

这取决于您要发送的数据类型,但是如果您要使用序列化来创建数据,则序列化为XML并使用GZipStream压缩它所产生的字节数要比压缩二进制序列化所生成的数据少。

I'm still trying to piece all of this together myself, but I do know that when you use the DataContractAttribute, you are using DataContract serialization. I'm not clear exactly on the differences between this serialization scheme and the Serializable scheme, but from what I've been able to gather, they are different.

Marc Gravell, one of the moderators here at SO, is the expert that I've looked to on this issue. He actually has a serialization scheme called protobuf-net that is available for use here .

  1. Use compression .. In 4.5

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

  2. Do not use namespaces set namespace to "" (and on the service contract as well.) [DataContract(Namespace = "" )] public class AddDeckMessage

  3. Rarely ( if ever send Interfaces / base classes on XML) ... XML does not understand and it adds Microsoft explcit XML. Do not use knowntype use plain DTOs which you can customize to the wire...

  4. Use EmitDefaultValue

  5. Be careful with byte[] with non tcp compression. If you see it as 123 your seeing 15-30 bytes for each byte depending on encoding. Use uuencode if you need to use standard WS protocols.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM