我们需要为低带宽网络创建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似乎也是一种选择。
但我想从头开始:如何修改配置(或最终创建自己的协议)以最小化发送的总字节数。安全性目前不是问题,性能也不是问题,它只是我感兴趣的发送/接收字节数。
感谢任何提示。
答案 0 :(得分:2)
你正好在netTcp uses SOAP,这可能会导致你的20字节有效负载膨胀到更多。
CodeProject: CompactMessageEncoder 中介绍了如何应用自定义绑定。如果有效负载类似于对象,并且您不会调用多种差异方法,Google's Protocol Buffers和custom 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;
}
}