簡體   English   中英

使用WCF通過網絡傳輸最少的數據

[英]Transmitting the least amount of data over the wire with WCF

我的項目有一個netTCP WCF服務。 這是它的app.config:

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

有什么可以做的事情來最大程度地壓縮通過網絡發送的數據? 我的項目是內部項目,因此速度和處理能力基本上沒有問題。

壓縮從客戶端發送到WCF服務的數據有哪些好的技巧和竅門?

綁定指定的消息編碼將確定如何將數據轉換為在線上的字節。 對於NetTcpBinding,它將自動使用二進制編碼,從而為您提供所有內置WCF編碼器中最緊湊的消息表示形式。

有關更多信息,我建議以下資源:

  1. Zulfiqar Ahmed: SOAP消息大小優化:編碼與壓縮
  2. 肯尼·沃爾夫(Kenny Wolf): WCF編碼器的性能特征
  3. MSDN: 選擇消息編碼器

這取決於您要發送的數據類型,但是如果您要使用序列化來創建數據,則序列化為XML並使用GZipStream壓縮它所產生的字節數要比壓縮二進制序列化所生成的數據少。

我仍在嘗試將所有這些整合在一起,但我確實知道,當您使用DataContractAttribute時,您正在使用DataContract序列化。 我不清楚這個序列化方案和Serializable方案之間的區別,但是根據我的了解,它們是不同的。

SO的主持人之一Marc Gravell是我一直致力於解決此問題的專家。 他實際上有一個稱為protobuf-net的序列化方案,可在此處使用。

  1. 使用壓縮..在4.5中

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

  2. 不要使用將命名空間設置為“”的命名空間(以及在服務協定上也是如此)。[DataContract(Namespace =“”)]公共類AddDeckMessage

  3. 很少(如果曾經在XML上發送接口/基類)... XML無法理解,並且會添加Microsoft引爆的XML。 請勿使用可自定義導線的已知類型使用普通DTO ...

  4. 使用EmitDefaultValue

  5. 注意使用非tcp壓縮的byte []。 如果將其視為123,則每個字節將看到15-30個字節,具體取決於編碼。 如果需要使用標准WS協議,請使用uuencode。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM