WCF - 以编程方式测量近似消息大小

标签 wcf datacontractserializer

给定一个类:

[DataContract]
public sealed class ChangedField
{
    [DataMember(Name="I")] public ushort FieldId { get; set; }
    [DataMember(Name="V")] public object Value { get; set; }
}

WireShark 显示,当通过 WCF TCP 绑定(bind)发送时,消息的编码是二进制的(仅限可打印字符,但你明白了):

ChangedFielda.I..a.V....e:double..e http://www.w3.org/2001/XMLSchema.s.....a.



但是如果我像这样序列化这种类型的实例......
var ser = new DataContractSerializer(typeof(ChangedField));
var stream = new MemoryStream();
ser.WriteObject(stream, new ChangedField { FieldId = 1, Value = 1.23d });

...然后流包含类似于以下内容的 SOAP XML:
<ChangedField>
  <I>1</I>
  <V i:type="a:double" xmlns:a="http://www.w3.org/2001/XMLSchema">1.23</V>
</ChangedField>

所以我的问题是如何控制DataContractSerializer在我自己的代码中生成这个二进制表示?

作为旁白:

如您所见,消息因 object 的事实而显得臃肿。属性必须对其类型进行编码(因此是 URI)。我将更改它以使用自定义二进制编码,因为在我的场景中,字段 ID 确定类型(在本例中为 double )。

最佳答案

默认情况下,TCP 绑定(bind)使用二进制消息编码器,而在第二个示例中,您只是将数据协定序列化为 XML。二进制消息编码器发生的情况是,它基本上为数据协定序列化程序提供了一个自定义 XmlWriter 实现,该实现生成专有的二进制格式,而不是 XML。

如果您想将此与不同的绑定(bind)(例如 HTTP)一起使用,则需要创建自定义绑定(bind)并添加 BinaryMessageEncodingElement元素而不是普通的 TextMessageEncodingElement。

关于WCF - 以编程方式测量近似消息大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074008/

相关文章:

wcf - 如何修复在 Amazon EC2 上运行的 .Net WCF 服务的 'Access Denied' 错误?

javascript - 如何在 AJAX URL 中传递参数?

c# - 由于 EndpointDispatcher 的 ContractFilter 不匹配,无法在接收方处理带有 Action 的消息

c# - 使 DataContract 中的 DataMember 使用隐式转换为字符串运算符

c# - 托管在 Windows 服务中的 WCF 服务 - 错误/预期的命名空间

c# - SlSvcUtil.exe 底层连接被关闭 : Could not establish trust relationship for the SSL/TSL secure channel

c# - WCF web.config 中的 readerQuotas 与请求限制

c# - 使用 DataContractSerializer 自定义序列化

c# - 具有长属性名称的 WCF DataContractSerializer 性能

c# - 使用 DataContractSerializer 处理序列化中的数组