WCF和Silverlight - 二进制编码

时间:2011-02-04 18:29:48

标签: c# silverlight wcf

我有一个奇怪的问题。我正在从HttpBasicEncoding切换到二进制编码。当我切换到使用二进制消息编码时,我注意到在Fiddler中我的响应体是比HttpBasicEncoding等效的20倍。以下是我在服务器上的设置:

使用基本编码时

<endpoint address="" binding="basicHttpBinding" bindingConfiguration="MyBinding"
  contract="MyProduct.MyService" />

...

<basicHttpBinding>
  <binding name="MyBinding">
    <security mode="TransportCredentialOnly" />
  </binding>
</basicHttpBinding>

使用二进制编码时

<customBinding>
  <binding name="MyBinaryBinding">
    <binaryMessageEncoding />
    <httpTransport />
  </binding>
</customBinding>

<endpoint address="" binding="customBinding" bindingConfiguration="MyBinaryBinding"
  contract="MyProduct.MyService" />

在Silverlight应用程序中,我需要以编程方式构建绑定。以下是我构建这些绑定的方法:

使用基本编码时

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;

// Wireup request

使用二进制编码时

HttpTransportBindingElement transportElement = new HttpTransportBindingElement();
  transportElement.MaxReceivedMessageSize = int.MaxValue;
  transportElement.MaxBufferSize = int.MaxValue;

  CustomBinding binding = new CustomBinding();
  binding.Elements.Add(new BinaryMessageEncodingBindingElement());
  binding.Elements.Add(transportElement);

  // Wireup request

我做错了什么?为什么二进制编码响应的大小比HTTP响应大得多?

谢谢!

1 个答案:

答案 0 :(得分:1)

BinaryFormatter和NetDataContractSerializer包含许多类型元数据和字段信息,并且它相加。为了生成更小的二进制文件,我建议使用protobuf-net(披露:在作者中),但请注意我没有在Silverlight上为WCF直接进行串行器交换,所以你必须发送byte []作为args和手动处理,但它小而快。我想改善那个领域。

实际上,通过该设置,常规的http绑定会更好,特别是如果您可以启用MTOM。我希望及时改进Silverlight的使用。