C# 通过WCF发送大型Xml字符串的最有效解决方案?

C# 通过WCF发送大型Xml字符串的最有效解决方案?,c#,.net,performance,wcf,serialization,C#,.net,Performance,Wcf,Serialization,我需要通过WCF发送和接收包含几个小字段和一个大Xml字符串的对象,如下所示: [DataContract] public class ServiceResponse { [DataMember] public int Id { get; set;} [DataMember] public string Xml {get; set;} } 我必须使用基于Http的绑定,但该服务是内部的,因此将共享契约DLL。Xml字符串可能达到几MB。该服务允许通过客户机在服

我需要通过WCF发送和接收包含几个小字段和一个大Xml字符串的对象,如下所示:

[DataContract]
public class ServiceResponse
{
    [DataMember]
    public int Id { get; set;}

    [DataMember]
    public string Xml {get; set;}
}
我必须使用基于Http的绑定,但该服务是内部的,因此将共享契约DLL。Xml字符串可能达到几MB。该服务允许通过客户机在服务器之间传输数据,因此第一个客户机调用检索一大块Xml,将其保存到本地磁盘,然后第二个调用将数据从磁盘传输到其他盒子上的另一个服务实例。因此,客户机实际上保存并转发数据,根本不需要任何逻辑或处理

我需要最有效的机制来发送这些对象,这意味着有效载荷小,速度快

一些问题:

  • 在有效负载中发送大块Xml的最有效方式是什么
  • 在使用
    BinaryFormatter
    通过线路发送对象之前,先将对象序列化为
    MemoryStream
    ,然后在服务操作中使用
    类型作为参数,这有什么好处吗
  • 对于几MB的邮件,使用流式传输模式有什么区别吗
我不能使用Protobuf net这样的第三方库(很遗憾)

谢谢你的建议

你的声明

在使用BinaryFormatter跨线路发送之前,将对象序列化为MemoryStream,然后在服务操作中使用流类型作为参数,这样做有什么好处吗

这意味着您实际上不需要发送
Xml
,而是发送当前序列化为
Xml
的对象

如果是这样,您将使用而不是二进制格式化程序获得最快的序列化和最佳压缩

有关更多信息和比较,请参阅

更新


如果您指的是使用BinaryFormatter序列化
ServiceResponse
,则协议缓冲区仍将提供优异的性能。

首先,我将它作为
XmlNode
而不是字符串发送:

[DataMember]
public XmlNode Xml {get; set;}

这避免了所有XML标记的编码。

数据传输=在服务器上准备的时间+传输时间+在客户端处理的时间

我想转机时间相当长。我以前很幸运地解决了这个问题,将其序列化为XML,压缩生成的字符串,然后发送字节数组或将压缩后的字符串序列化为base64

它增加了处理时间,但远不及未压缩版本的传输时间


正在讨论的应用程序在启动时缓存的静态/启动数据是未压缩的数兆字节,在世界各地使用,因此在低质量连接区域中,需要压缩。

“几个小字段,加上一个大Xml字符串”。他并不是说该对象被序列化为XML,而是说该对象包含一个XML字符串。话虽如此,我认为你的答案仍然是正确的。对不起,我的意思是,不能使用protobuf。在Xml上,这不是对象的表示,它实际上是Xml数据。所以我建议将Xml转换为二进制。@MalcomTucker:为什么没有protobuf,而BinaryFormatter是一个选项?在这个阶段,我不能添加第三方依赖项。这可能会改变,但现在情况就是这样。此外,我还希望得到一些能够探索这些选项的答案,而不是简单地说“使用protobuf”。我知道protobuf,我知道人们会带着它飞进来,但我对一个更深层次的答案感兴趣:)预序列化和发送
参数与通过web服务绑定通过Http发送二进制文件有何不同?它在客户端提供什么服务吗?有效载荷更小吗?是否相同(即WCF是否只是在幕后使用BinaryFormatter)?