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

时间:2013-02-25 21:45:21

标签: 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。该服务允许通过客户端机器在服务器之间传输数据,因此第一个客户端调用检索大量Xml,将其保存到本地磁盘,然后第二次调用将数据从磁盘传输到另一个其他框上的另一个服务实例。因此,客户端实际上会保存数据并转发数据,而不是逻辑或处理。

我需要最有效的机制 - 意味着小的有效负载,并且快速 - 用于发送这些对象。

有些问题:

  • 在有效负载中发送大块Xml的最有效方法是什么?
  • 在使用MemoryStream通过线路发送然后使用BinaryFormatter类型作为服务操作中的参数之前,将对象序列化为Stream是否有任何优势?
  • 对于几MB的邮件,使用Streamed传输模式会有什么不同吗?

我不能使用像Protobuf-net这样的第三方库(遗憾的是)。

欣赏任何建议......

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

我猜测转移时间很长。通过序列化到XML,压缩生成的字符串,然后发送字节数组或将zip压缩字符串序列化到base64,我有幸解决了这个问题。

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

有问题的应用程序的站点/启动数据在启动时缓存是几兆字节未压缩,在世界各地使用,因此在低质量连接区域,压缩是必要的..