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

本文关键字:有效 解决方案 字符串 Xml WCF 大型 通过 | 更新日期: 2023-09-27 18:00:58

我需要通过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,然后在服务操作中使用Stream类型作为参数,这有什么好处吗
  • 对于几MB的消息,使用Streamed传输模式有什么区别吗

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

感谢任何建议。。。

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

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

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

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

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

我想转会时间是相当长的。我以前很幸运地解决了这个问题,方法是串行化到XML,压缩得到的字符串,然后发送一个字节数组或串行化压缩后的字符串到base64。

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

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

您的报表

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

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

如果是这样,您将使用Protocol Buffers而不是BinaryFormatter获得最快的序列化和最佳压缩。

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

https://stackoverflow.com/a/11550778/141172

更新

如果您指的是使用BinaryFormatter序列化ServiceResponse,那么协议缓冲区仍然可以提供卓越的性能。