在传输的总字节数方面,最紧凑的wcf绑定是什么?

时间:2015-04-03 09:10:59

标签: c# wcf bandwidth

我们需要为低带宽网络创建WCF服务。所以我们的目标是创建绑定配置,每次调用产生最小的字节数。这是app.config

的摘录
<customBinding>
   <binding name="binaryBinding">
     <binaryMessageEncoding/>
     <tcpTransport />
   </binding>
</customBinding>

我认为建立连接也会引入开销,因此我们会将其保持在最低限度。典型的情况是

Client.Connect();
while (!userTerminates())
{
  var Response = Client.DoSomething(parameters);
  <user input>
  var anotherResponse = Client.DoSomethingElse(otherParameters);
}
Client.Close();

发送/接收的数据从大约20个字节到几个100不等。

到目前为止,我设法将WCF设置为使用netTcpBinding和二进制编码,但我仍然有400%的开销。我发送了一个600字符的字符串并收到2200.我通过使用MessageInspector来测量它,它测量传入和传出消息的长度。我假设开销来自SOAP消息。 编辑:也许我的测量是错误的。

我也理解我可以压缩通信,如WCF示例库中所示。 GoogleProtocol似乎也是一种选择。

但我想从头开始:如何修改配置(或最终创建自己的协议)以最小化发送的总字节数。安全性目前不是问题,性能也不是问题,它只是我感兴趣的发送/接收字节数。

感谢任何提示。

2 个答案:

答案 0 :(得分:2)

你正好在netTcp uses SOAP,这可能会导致你的20字节有效负载膨胀到更多。

CodeProject: CompactMessageEncoder 中介绍了如何应用自定义绑定。如果有效负载类似于对象,并且您不会调用多种差异方法,Google's Protocol Bufferscustom framing protocol over sockets

答案 1 :(得分:1)

开销是由WCF将对象序列化为XML流引起的。这意味着它不会对其序列化的字段的顺序或格式做出任何假设,并且需要在消息中提供此信息。二进制消息编码器使用XmlDictionaryReader / Writer来序列化消息并使用字典来查找先前在会话中传输的字段。但是,在某些时候,这些信息会在客户端和服务器之间传递,这会导致额外的字节传输,具体取决于数据合同的大小。

要减少有效负载,请考虑编写自己的序列化程序,如下所示:http://www.codeproject.com/Articles/434665/WCF-Serialization-A-Case-Study

您也可以考虑在OnSerializing和OnDeserialized方法中序列化之前将数据打包在单个字段中,如下所示:

[DataContract]
public class Data
{
    [DataMember]
    private byte data;

    private bool bool1;
    private bool bool2;

    [OnSerializing]
    internal void OnSerializing()
    {
        data = Convert.ToByte((bool1 ? 0 : 1) & (bool2 ? 0 : 2));
    }

    [OnDeserialized]
    internal void OnDeserializing()
    {
        bool1 = (Convert.ToInt32(data) & 1) != 0;
        bool2 = (Convert.ToInt32(data) & 2) != 0;
    }
}