2010-06-16 30 views
3

我已经继承了一个与Web服务对话的C#.NET应用程序,并且该Web服务与Oracle数据库对话。我需要向UI添加导出功能,以生成一些数据的Excel电子表格。通过ASMX Web服务传输大型数据集的最佳方式是什么?

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

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

所以,如果有人知道更好的方法来检索大量的数据(表格格式)通过一个ASMX网络服务,请让我知道!

+0

多少数据?你确定它是数据量,不可能是查询或其他造成这种情况的东西? – cdonner 2010-06-16 01:33:06

+0

它可能是查询,它只有几千行数据。它只能在100Mbps网络上以大约100k /秒的速度回来。但我想象的问题仍然是一样的 - 数据需要很长时间才能到达,客户端应用程序没有得到任何反馈来知道发生了什么,所以它最终超时。 – Malvineous 2010-06-16 02:54:55

回答

2

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

+0

-1:这是关于ASMX网络服务,这是一项传统技术。请参阅http://msdn.microsoft.com/en-us/library/7bkzywba.aspx和许多其他页面。 – 2010-06-16 01:40:03

+1

@Malvineous你使用asmx或WCF?我可以通过WCF链接更新答案... – 2010-06-16 01:42:48

+0

我正在使用ASMX(我认为,Web服务URL以.asmx结尾),因为这是应用程序附带的内容。将该调用放在另一个线程中可能不会有太大帮助,因为我仍然会在客户端上发生超时错误。 – Malvineous 2010-06-16 02:51:53

2

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

您还应该在一个单独的线程中调用您的webservice以避免捆绑您的用户界面。

6

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

  1. 试图限制数据传输量
  2. 如果您要转移ñ表,同时他们分成N个数据表和传递一个数据表。
  3. 传输前压缩数据集/数据表。这会产生巨大的(巨大的)影响。另一方面,将字节流解压缩回数据集/数据表。不要使用.NET的内置压缩 - 使用SharpZipLib。它提供了更好的结果。
  4. 此外,您可以异步执行传输以防止客户端锁定。

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

+0

感谢您的建议。通常情况下,这可以正常工作,但在我的特殊情况下,它只是一个需要传输的大表,因此无法将其分割成更小的表。由于它只能在100Mbps的网络上以100k /秒的速度运行,所以我认为压缩不会有帮助,即使是异步的,它仍然需要足够长的时间才能使呼叫超时:-( – Malvineous 2010-06-24 04:24:14

1

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

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

0

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

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

Pagination QueriesPagination tips

但是,如果你不局限于使用web服务的解决方案,那么你可能想调查提供报告服务给用户。绝对值得您一边调查这个备选方案:)

+0

感谢您的建议。寻呼并不是很理想,因为数据来自Oracle视图,并且很大一部分放缓正在运行该视图,因此即使它被分页,每个页面也会非常缓慢(除非我在某些方法之间保持Oracle光标打开)... – Malvineous 2010-06-24 04:21:31

+0

@Malvineous,你不必保持你的光标在两次调用之间打开,看到我上面更新的链接,希望它有帮助 – Syd 2010-06-24 05:03:48

2

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

相关问题