3

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

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

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

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

4

6 回答 6

6

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

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

我们的客户多年来一直在使用上述解决方案,没有出现任何问题。

于 2010-06-16T01:40:48.173 回答
2

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

于 2010-06-16T01:32:47.003 回答
2

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

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

于 2010-06-16T01:35:32.457 回答
2

请参阅 MSDN 库中的“大数据和流”。

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

于 2010-06-16T01:42:08.850 回答
2

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

于 2010-06-16T03:51:23.880 回答
0

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

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

请参阅分页查询分页提示

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

于 2010-06-16T03:41:51.977 回答