2013-02-25 56 views
2

我需要发送,并通过WCF接收包含几个小领域,再加上一个大的XML字符串对象,像这样:通过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通过线路发送然后使用Stream类型作为服务操作中的参数之前,将对象序列化到MemoryStream有任何优势吗?
  • 对于几MB的消息,是否使用Streamed传输模式有什么区别?

我不能使用像Protobuf-net(悲伤)的第三方库。

欣赏任何意见...

回答

0

你的陈述

是否有任何优势,在使用BinaryFormatter的跨网发送,然后使用流类型作为参数之前序列化对象到一个MemoryStream在服务操作中?

意味着你并不真的需要发送Xml,而是当前序列化为Xml的对象。

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

欲了解更多信息和比较看

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

UPDATE

如果你指的是用BinaryFormatter的序列化ServiceResponse,Protocol Buffers的仍然会提供卓越的性能。

+1

“几个小领域,加一个大的Xml字符串“。他并不是说该对象被序列化为XML,而是该对象包含一个xml字符串。话虽如此,我认为你的答案仍然是正确的。 – aquinas 2013-02-25 21:51:49

+0

不好意思,说不能用protobuf。在Xml上,不,这不是一个对象的表示,它实际上是Xml数据。所以我建议将Xml转换为二进制。 – MalcomTucker 2013-02-25 21:52:55

+0

@MalcomTucker:当BinaryFormatter是一个选项时,为什么没有protobuf? – 2013-02-25 21:53:51

2

一开始,我将它作为XmlNode而不是字符串:

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

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

1

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

我猜测传输时间相当长。我已经有幸通过序列化XML来解决这个问题,zip-compressing生成的字符串,然后发送一个字节数组或将zip压缩的字符串序列化为base64。

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

的问题缓存上启动应用程序人大常委会/启动数据是数兆字节未经压缩的,在世界各地使用,所以在低质量的连接区域,压缩是必要的..

相关问题