通过Web服务返回大结果

lom*_*axx 9 .net c# web-services

我目前正在开发一个Web服务,并且返回的结果可能非常大(> 5mb).

这组数据非常有效,并且Web服务可以称为同步或异步,但我想知道人们对以下内容的看法:

  1. 如果连接丢失,则必须重新生成整个结果集并再次发送.如果连接丢失或重置,有什么办法可以做任何"恢复"吗?

  2. 发送一个这么大的结果集是否合适?是否更好地实现某种"分页",其中结果集生成并存储在服务器上,然后客户端可以以较小的数量下载结果集的块并在结束时重新组合集合?

Dav*_*eri 3

我见过所有三种方法:分页存储和检索以及大规模推送

我认为您的问题的解决方案在某种程度上取决于您的结果集为何如此之大以及它是如何生成的。您的结果会随着时间的推移而增长吗?它们是一次性计算出来然后推送的吗?您想在获得结果后立即将它们流回吗?

分页方式

根据我的经验,当客户端需要快速访问类似于搜索结果中的页面的合理大小的结果集块时,使用分页方法是合适的。这里要考虑的是协议的整体混乱性、客户端页面请求之间整个结果集的缓存和/或生成结果页面所需的处理时间。

存储和检索

当结果不是随机访问并且结果集的大小随着查询的处理而增长时,存储和检索非常有用。这里要考虑的问题是客户端的复杂性,以及是否可以向用户提供部分结果,或者是否需要在将任何结果返回给客户端之前计算所有结果(考虑对分布式搜索引擎的结果进行排序)。

大力推动

大规模推送的方法几乎肯定是有缺陷的。即使客户端需要所有信息并且需要将其推送到一个整体结果集中,我也建议采取WS-ReliableMessaging(直接或通过您自己的简化版本)并对结果进行分块的方法。通过这样做你

  1. 确保零件到达客户手中
  2. 一旦收到客户端的收据就可以丢弃该块
  3. 可以减少由于必须在服务器和客户端上保留 5MB 的 XML、DOM 或内存中的任何内容(假设您没有以流方式处理结果)而导致的内存消耗问题。

但就像其他人所说的那样,在您知道结果集的大小、结果集的生成方式以及整体性能是实际问题之前,不要执行任何操作。