优化WCF带宽传输(降低详细程度)

时间:2017-10-25 23:41:29

标签: c# wcf serialization binary-serialization verbosity

我们目前正在使用WCF在我们的客户端和服务器之间进行传输。我们正在使用HttpTransportBinding和BinaryMessageEncoding。后端是.NET,前端是Xamarin(iOS,Android,Windows 10)和Silverlight。我们正在寻找不同的转移选择。当然还有REST和Web套接字,但我的问题与序列化有关 - 而不是实际的协议。但是,我正在考虑减少传输带宽的所有选项。

最终目标是使用仅传输最少数据的二进制序列化,以便DataContract序列化正常工作。转移不需要是人类可读的,这就是我们不使用Json的原因。我愿意看看其他类型的序列化或其他可以完成这项工作的DataContractSerializer,但我现在正在努力的是,WCF通过网络发送的数据比实际需要的多。如果我查看Fiddler中的数据,我可以看到它发送的DataMembers为null或空,XML名称空间完全不相关,等等。

这是一个典型的转移: enter image description here

在这里你可以看到我试图阻止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兑现我的请求吗?是否有更高效的DataContractSerializer与Xamarin兼容?还有其他任何减少WCF冗长的技巧吗?我在宣布我的属性的方式上做错了什么,或者我认为序列化程序应该足够智能而不包含默认值?

令人沮丧的是,除了这个问题之外,当您知道该服务的所有消费者都将基于Microsoft时,WCF是一项非常好的技术。从表面上看,似乎微软似乎不再需要改进WCF及其后续部分,如DataContractSerialization。我宁愿不批发更换技术。我宁愿用冗长的问题解决问题。

请保存替代技术建议仅供评论使用。

1 个答案:

答案 0 :(得分:0)

部分答案: https://bkiener.wordpress.com/2010/05/04/optimize-data-contracts-for-better-wcf-performance/

可以做的一件事是通过在属性本身中指定其名称来减少DataContracts和Properties的名称。所以,一个名为" ReallyLongPropertyNameThatEatsBandwidth"可以别名为" a"。我做了一些基本的测试,我们的一个电话从188k下降到168k。这仍然无法解释转移中的所有其他垃圾,但它有所帮助。