C# 使用WCF通过线路传输最少的数据量

C# 使用WCF通过线路传输最少的数据量,c#,.net,wcf,C#,.net,Wcf,我的项目有一个netTCP WCF服务。 这是它的app.config: <?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <bindings> <netTcpBinding> <binding name="NetTcpBinding_IIndexe

我的项目有一个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>
  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>

有什么方法可以最大限度地压缩通过网络发送的数据吗?我的项目是内部的,所以速度和处理能力基本上没有问题

  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>

压缩从客户端发送到WCF服务的数据有哪些好的技巧和窍门?

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

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

我自己仍在尝试将所有这些组合在一起,但我知道,当使用DataContractAttribute时,您使用的是DataContract序列化。我不清楚这个序列化方案和可序列化方案之间到底有什么区别,但从我收集的资料来看,它们是不同的

  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>

Marc Gravell,SO的主持人之一,是我在这个问题上所期待的专家。实际上,他有一个名为protobuf net的序列化方案可供使用。

我自己仍在尝试将所有这些结合起来,但我知道,当您使用DataContractAttribute时,您使用的是DataContract序列化。我不清楚这个序列化方案和可序列化方案之间到底有什么区别,但从我收集的资料来看,它们是不同的

  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>

Marc Gravell,SO的主持人之一,是我在这个问题上所期待的专家。实际上,他有一个名为protobuf-net的序列化方案可供使用。

绑定指定的消息编码将决定数据如何在线路上转换为字节。对于NetTcpBinding,它将自动使用二进制编码,这将为您提供所有内置WCF编码器中最紧凑的消息表示

  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>
有关更多信息,我建议使用以下资源:

  <binaryMessageEncoding compressionFormat="GZip"/>

  <tcpTransport maxReceivedMessageSize="20000000"/>
</binding>
  • 祖尔菲卡尔·艾哈迈德:
  • 肯尼·沃尔夫:
  • MSDN:

  • 绑定指定的消息编码将决定数据如何在线路上转换为字节。对于NetTcpBinding,它将自动使用二进制编码,这将为您提供所有内置WCF编码器中最紧凑的消息表示

      <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
    有关更多信息,我建议使用以下资源:

      <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 祖尔菲卡尔·艾哈迈德:
  • 肯尼·沃尔夫:
  • MSDN:
  • 使用压缩。。在4.5中

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

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 不要使用名称空间将名称空间设置为“”(也不要在服务合约上设置名称空间) [DataContract(名称空间=”)] 公共类addDeck消息

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 很少(如果曾经发送XML上的接口/基类的话)。。。XML不理解,它添加了Microsoft Explicit XML。不要使用knowntype使用普通DTO,您可以根据线路自定义这些DTO

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 使用默认值

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 使用非tcp压缩时,请小心字节[]。如果您将其视为123,则根据编码的不同,每个字节可以看到15-30个字节。如果需要使用标准WS协议,请使用uuencode

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 使用压缩。。在4.5中

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

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 不要使用名称空间将名称空间设置为“”(也不要在服务合约上设置名称空间) [DataContract(名称空间=”)] 公共类addDeck消息

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 很少(如果曾经发送XML上的接口/基类的话)。。。XML不理解,它添加了Microsoft Explicit XML。不要使用knowntype使用普通DTO,您可以根据线路自定义这些DTO

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 使用默认值

  •   <binaryMessageEncoding compressionFormat="GZip"/>
    
      <tcpTransport maxReceivedMessageSize="20000000"/>
    </binding>
    
  • 使用非tcp压缩时,请小心字节[]。如果您将其视为123,则根据编码的不同,每个字节可以看到15-30个字节。如果需要使用标准WS协议,请使用uuencode

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

    这就是我感到困惑的地方——我没有设置任何序列化,我要么传输原语,要么传输自定义类的数组。自定义类既不继承ISerializable,也没有标记为[Serialized]属性。我所做的就是用[datamember]属性标记所有自定义类的公共属性。除此之外,没有采取其他行动。所以我真的不知道我有什么-(哦。那么,你并不是真的在控制传输的内容。你可以查看WCF流控件,看看你可以添加什么压缩(我没有这样做)。或者,您可以停止传输实际对象,并更改合同以传输转换为实际对象或从实际对象转换而来的压缩blob。基于很难找到有关TCP上WCF压缩的信息以及中存在压缩功能,我怀疑您需要编写代码或purcha使用第三方压缩功能。这就是我感到困惑的地方——我没有设置任何序列化,我正在传输原语或自定义类的数组。自定义类既没有继承ISerializable,也没有标记为[Serialized]属性。我所做的只是用[datamember]属性。除此之外,没有做任何其他操作。因此我不知道我有什么。:-(哦。那么,您并不是真正控制传输的内容。您可以查看WCF流控件