优化 WCF 带宽传输(减少冗长)
Optimizing WCF Bandwidth Transfer (Reducing Verbosity)
我们目前正在使用 WCF 在客户端和服务器之间进行传输。我们使用 HttpTransportBinding 和 BinaryMessageEncoding。后端是.NET,前端是Xamarin(iOS,Android,Windows10)和Silverlight。我们正在寻找不同的转移选项。当然还有 REST 和 Web 套接字,但我的问题与序列化有关——而不是实际的协议。然而,我正在研究我们所有用于降低传输带宽的选项。
最终目标是使用仅传输最少数据的二进制序列化,以便 DataContract 序列化正常工作。传输不需要人类可读,这就是我们不使用 Json 的原因。我愿意查看其他类型的序列化或其他可以完成这项工作的 DataContractSerializer,但我现在正在努力解决的问题是 WCF 通过网络发送的数据比实际需要的多。如果我查看 Fiddler 中的数据,我可以看到它正在发送 null 或空的 DataMembers,完全不相关的 XML 名称空间,等等。
这是一个典型的转账:
在这里你可以看到我试图阻止 DataContractSerializer 在属性级别通过网络发送这些东西,但 DataContractSerializer 忽略了我的请求:
[DataMember(IsRequired = false)]
bool IsPrimaryKeyOnly { get; set; }
[DataMember(IsRequired = false)]
ErrorDictionary ErrorDetails { get; set; }
[DataMember(IsRequired =false)]
bool IgnoreWarnings { get; set; }
[System.Runtime.Serialization.DataContractAttribute(IsReference = true, Namespace = "")]
[System.SerializableAttribute()]
public class AssetClass : Adapt.Model.RecordBase, Adapt.Model.IRecord
{
}
我可以做些什么来让 DataContractSerializer 满足我的请求吗?是否有与 Xamarin 兼容的更高效的 DataContractSerializer?任何其他减少 WCF 冗长的技巧?我在这里声明我的属性的方式是否做错了,或者我认为序列化程序应该足够聪明而不包含默认值是错误的吗?
令人沮丧的是,除了这个问题之外,当您知道该服务的所有使用者都将基于 Microsoft 时,WCF 是一项非常好的技术。从表面上看,Microsoft 似乎不再费心改进 WCF 及其后续部分,例如 DataContractSerialization。我宁愿不批发更换技术。我宁愿解决冗长的问题。
请保存备选技术建议,仅供评论。
部分答案:
https://bkiener.wordpress.com/2010/05/04/optimize-data-contracts-for-better-wcf-performance/
可以做的一件事是通过在属性本身中指定名称来减少 DataContracts 和 Properties 的名称。因此,名为 "ReallyLongPropertyNameThatEatsBandwidth" 的 属性 可以别名为 "a"。我对此做了一些基本测试,我们的一个电话从 188k 下降到 168k。这仍然不能解释传输中的所有其他垃圾,但它有所帮助。
我们目前正在使用 WCF 在客户端和服务器之间进行传输。我们使用 HttpTransportBinding 和 BinaryMessageEncoding。后端是.NET,前端是Xamarin(iOS,Android,Windows10)和Silverlight。我们正在寻找不同的转移选项。当然还有 REST 和 Web 套接字,但我的问题与序列化有关——而不是实际的协议。然而,我正在研究我们所有用于降低传输带宽的选项。
最终目标是使用仅传输最少数据的二进制序列化,以便 DataContract 序列化正常工作。传输不需要人类可读,这就是我们不使用 Json 的原因。我愿意查看其他类型的序列化或其他可以完成这项工作的 DataContractSerializer,但我现在正在努力解决的问题是 WCF 通过网络发送的数据比实际需要的多。如果我查看 Fiddler 中的数据,我可以看到它正在发送 null 或空的 DataMembers,完全不相关的 XML 名称空间,等等。
这是一个典型的转账:
在这里你可以看到我试图阻止 DataContractSerializer 在属性级别通过网络发送这些东西,但 DataContractSerializer 忽略了我的请求:
[DataMember(IsRequired = false)]
bool IsPrimaryKeyOnly { get; set; }
[DataMember(IsRequired = false)]
ErrorDictionary ErrorDetails { get; set; }
[DataMember(IsRequired =false)]
bool IgnoreWarnings { get; set; }
[System.Runtime.Serialization.DataContractAttribute(IsReference = true, Namespace = "")]
[System.SerializableAttribute()]
public class AssetClass : Adapt.Model.RecordBase, Adapt.Model.IRecord
{
}
我可以做些什么来让 DataContractSerializer 满足我的请求吗?是否有与 Xamarin 兼容的更高效的 DataContractSerializer?任何其他减少 WCF 冗长的技巧?我在这里声明我的属性的方式是否做错了,或者我认为序列化程序应该足够聪明而不包含默认值是错误的吗?
令人沮丧的是,除了这个问题之外,当您知道该服务的所有使用者都将基于 Microsoft 时,WCF 是一项非常好的技术。从表面上看,Microsoft 似乎不再费心改进 WCF 及其后续部分,例如 DataContractSerialization。我宁愿不批发更换技术。我宁愿解决冗长的问题。
请保存备选技术建议,仅供评论。
部分答案: https://bkiener.wordpress.com/2010/05/04/optimize-data-contracts-for-better-wcf-performance/
可以做的一件事是通过在属性本身中指定名称来减少 DataContracts 和 Properties 的名称。因此,名为 "ReallyLongPropertyNameThatEatsBandwidth" 的 属性 可以别名为 "a"。我对此做了一些基本测试,我们的一个电话从 188k 下降到 168k。这仍然不能解释传输中的所有其他垃圾,但它有所帮助。