通过Web服务返回大结果

时间:2008-08-15 00:08:16

标签: c# .net web-services

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

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

  1. 如果连接丢失,则 整个结果集必须是 重新生成并再次发送。在那儿 我可以做任何形式的任何方式 如果连接丢失,则“恢复” 或重置?

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

    < / LI>

4 个答案:

答案 0 :(得分:3)

我见过这三种方法,分页存储和检索,以及大量推送

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

寻呼方法

根据我的经验,当客户端需要快速访问与搜索结果中的页面类似的结果集的合理大小的块时,使用分页方法是合适的。这里的注意事项包括协议的整体干扰,客户端页面请求之间的整个结果集缓存,和/或生成结果页面所需的处理时间。

存储和检索

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

大规模推送

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

  1. 确保碎片到达客户
  2. 可以在您从客户收到收据后立即丢弃该块
  3. 可以减少内存消耗的可能问题,因为必须在服务器端和客户端保留5MB的XML,DOM或内存中的任何内容(假设您没有以流方式处理结果)。
  4. 就像其他人所说的那样,在你知道结果集大小,生成方式以及整体性能成为实际问题之前,不要做任何事情。

答案 1 :(得分:2)

结果集大小没有针对5 Mb的硬法。超过400 Mb可以是hard to send

您将自动获得异步处理程序(因为您正在使用.net)

  

实现某种“分页”在哪里   生成并存储结果集   然后在服务器和客户端上   下载结果集的块   少量并重新组装   设在最后

这已经发生在你身上 - 它被称为tcp / ip ;-)重新实施可能有点矫枉过正。

同样 -

  

整个结果集必须是   重新生成并再次发送

如果它是MS-SQL,例如生成大部分结果集 - 那么重新生成它将利用SQL Server中的一些隐式缓存,后续代将更快。

在某种程度上,你可以逃避不担心这些问题,直到它们表现为“真正的”问题 - 因为你正在使用的平台会照顾到很多性能瓶颈。 / p>

答案 2 :(得分:0)

我有点不同意秘密杰克的评论:

  

这已经发生在你身上 - 它被称为tcp / ip ;-)重新实施可能有点矫枉过正。

有时您可能想要这样做,但实际上只是从UI的角度来看。如果您实现某种方式将数据流式传输到客户端(通过像推送机制之类的东西),或者按照您的建议将其分块到页面中,那么您可以在客户端上加载一些非常小的子集,然后慢慢构建UI全部数据。

这样可以提供更加流畅,更快速的用户界面(从用户的角度来看),但是你必须评估额外的努力是否值得......因为我认为这不会是一项微不足道的工作量。

答案 3 :(得分:0)

所以听起来你会对你的网络方法添加'起始记录号'和'最终记录号'参数的解决方案感兴趣。 (或'页码'和'每页结果')

如果后备存储是sql server(甚至是mysql),这应该不会太难,因为它们内置了对行号的支持。

尽管如此,你应该能够避免在服务器上进行任何会话管理,避免对结果集进行任何显式缓存,只需依靠后备存储的缓存来保持生活简单。