0

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

最终目标是使用仅传输最少数据的二进制序列化,以使 DataContract 序列化正常工作。传输不需要人类可读,这就是我们不使用 Json 的原因。我愿意查看其他类型的序列化或其他可以完成这项工作的 DataContractSerializers,但我现在正在努力解决的是 WCF 通过网络发送的数据比实际需要的数据多得多。如果我查看 Fiddler 中的数据,我可以看到它正在发送 null 或空的 DataMember、完全不相关的 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 是一项非常好的技术。从表面上看,微软似乎不再费心改进 WCF 及其后续部分,例如 DataContractSerialization。我宁愿不批发更换技术。我宁愿解决冗长的问题。

请保存替代技术建议以供评论。

4

1 回答 1

0

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

可以做的一件事是通过在属性本身中指定它们的名称来减少 DataContracts 和 Properties 的名称。因此,名为“ReallyLongPropertyNameThatEatsBandwidth”的属性可以别名为“a”。我对此进行了一些基本测试,我们的一次通话从 188k 降至 168k。这仍然不能解释转移中的所有其他垃圾,但它有帮助。

于 2017-10-26T01:50:01.973 回答