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

时间:2010-06-16 01:27:25

标签: .net web-services asmx large-data-volumes

我继承了一个与Web服务对话的C#.NET应用程序,并且Web服务与Oracle数据库进行通信。我需要向UI添加导出功能,以生成一些数据的Excel电子表格。

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

在我开始并提出一些分裂呼叫的狡猾方式之前,我想知道是否已经存在可以处理这个问题的东西。目前我正在考虑一个startExport函数,然后重复调用next50Rows函数,直到没有数据,但因为Web服务是无状态的,这意味着我将不得不保留某种ID号并处理相关权限。这意味着我不必将整个数据集加载到Web服务器的内存中,这是一件好事。

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

6 个答案:

答案 0 :(得分:6)

几年前我们有过这个确切的商业场景,我会告诉你我们做了什么。

  1. 尝试限制传输的数据量
  2. 如果要传输n个表,请将它们拆分为n个数据表,并一次传输一个数据表。
  3. 转移前压缩数据集/数据表。这会产生巨大的(巨大的)影响。另一方面,将字节流解压缩回数据集/数据表。不要使用.NET的内置压缩 - 使用SharpZipLib。它提供了更好的结果。
  4. 此外,您可以异步执行传输以防止客户端锁定。
  5. 我们的客户多年来一直使用上述解决方案,没有问题。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

我建议将任务卸载到SSRS,它可以毫无问题地处理长时间运行的查询。您可以使用报表生成器构建报表,然后使用.NET应用程序调用SSRS Web服务运行报表,并以Excel格式(作为字节数组)导出结果。有关使用.asmx服务的示例代码,请参阅this page;有关使用WCF调用SSRS,请参阅this page

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

答案 3 :(得分:2)

请参阅MSDN Library中的“Large Data and Streaming”。

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

答案 4 :(得分:2)

我推荐WCF数据服务(或者现在叫做的任何东西)。您可以公开一个oData端点(如果您在Web服务的两侧都有.NET)为您提供透明的请求限制(服务器限制单个调用中的响应数,并且客户端会根据需要自动发出其他请求)。它还为您提供了IQueryable风格的界面,非常灵活。

答案 5 :(得分:0)

问题很常见:​​您有大量数据要返回给用户。

如果运气好,您可能会因增加网络服务超时而逃脱。否则,将一次返回页面数据的解决方案反馈给用户是否符合您的要求?在此设计中,调用者将负责指定起始页以及每页到Web服务的数据行数。

请参阅Pagination QueriesPagination tips

但是,如果您不仅限于使用webservice作为解决方案,那么您可能希望调查向您的用户提供Reporting Services。绝对值得您研究这个替代选项:)