代码之家  ›  专栏  ›  技术社区  ›  Malvineous

通过ASMX web服务传输大型数据集的最佳方式是什么?

  •  3
  • Malvineous  · 技术社区  · 16 年前

    我继承了一个C#。NET应用程序,该应用程序与web服务对话,web服务与Oracle数据库对话。我需要在UI中添加一个导出功能,以生成一个Excel电子表格,其中包含一些数据。

    我创建了一个web服务函数来运行数据库查询,将数据加载到一个DataTable中,然后返回它,这对于少量行来说效果很好。但是,完整运行中有足够的数据,因此客户端应用程序会锁定几分钟,然后返回超时错误。显然,这不是检索如此大的数据集的最佳方式。

    在我继续想出一些狡猾的分拆电话的方法之前,我想知道是否已经有什么东西可以处理这个问题了。目前,我正在考虑一个startExport函数,然后反复调用next50Rows函数,直到没有数据为止,但由于web服务是无状态的,这意味着我必须保留某种ID号,并处理相关的权限。这意味着我不必将整个数据集加载到web服务器的内存中,这是一件好事。

    因此,如果有人知道通过ASMX web服务检索大量数据(表格式)的更好方法,请告诉我!

    6 回复  |  直到 16 年前
        1
  •  6
  •   Matt    16 年前

    我们几年前就有过这样的商业场景,我来告诉你我们做了什么。

    1. 尽量限制传输的数据量
    2. 如果要传输n个表,请将它们拆分为n个数据表,然后一次传输一个数据表。
    3. 在传输之前压缩数据集/数据表。这会产生巨大的影响。另一方面,将字节流解压缩回dataset/datatable。不要使用。NET的内置压缩功能——使用SharpZipLib。它的效果要好得多。
    4. 此外,还可以异步执行传输,以防止客户端锁定。

    多年来,我们的客户一直在毫无问题地使用上述解决方案。

        2
  •  2
  •   Kate Gregory    16 年前

    我怀疑你只是想异步调用web服务,这样你的应用程序就不会在UI上阻塞了。看看 http://msdn.microsoft.com/en-us/library/ms233842.aspx 看看是否有帮助。

        3
  •  2
  •   Juliet    16 年前

    我建议将任务转移给SSRS,它可以毫无问题地处理长时间运行的查询。您可以使用报表生成器生成报表,然后使用。NET应用程序调用SSRS web服务运行您的报告,并将结果导出回Excel格式(作为字节数组)。看见 this page 对于使用的示例代码。asmx服务,以及 this page 用于使用WCF调用SSR。

    您还应该在单独的线程中调用Web服务,以避免占用UI。

        4
  •  2
  •   John Saunders    16 年前

    看“ Large Data and Streaming “在MSDN库中。

    如果您对大型数据传输的性能感兴趣,请不要使用ASMX web服务。

        5
  •  2
  •   Stephen Cleary    16 年前

    我推荐WCF数据服务(或者现在叫什么)。您可以公开一个oData端点(如果Web服务两侧都有.NET),该端点为您提供透明的请求限制(服务器限制单个调用中的响应数量,客户端根据需要自动发出额外请求)。它也给你一个 IQueryable -风格界面非常灵活。

        6
  •  0
  •   Syd    16 年前

    问题很常见:你有很多数据要返回给用户。

    如果幸运的话,可以通过增加Web服务超时来逃脱。否则,一次向用户返回页面数据的解决方案是否符合您的要求?在这种设计中,调用者将负责指定起始页,以及每页向Web服务发送多少行数据。

    看见 Pagination Queries Pagination tips

    但是,如果您不局限于使用webservice作为解决方案,那么您可能希望调查向用户提供报告服务的情况。绝对值得你去研究这个备选方案:)

    推荐文章