我继承了一个C# .NET应用程序,它与一个Web服务进行通信,而Web服务与一个Oracle数据库进行通信。我需要向UI添加一个导出函数,以生成一个包含某些数据的Excel电子表格。
我创建了一个Web服务函数来运行数据库查询,将数据加载到DataTable中,然后返回它,这对于少量的行来说很好。然而,在完整运行中有足够的数据,客户端应用程序锁定几分钟,然后返回超时错误。显然,这不是检索如此大的数据集的最佳方法。
在我继续并想出一些分裂调用的狡猾方法之前,我想知道是否已经有一些东西可以处理这个问题。目前我正在考虑一个startExport函数,然后反复调用一个next 50函数,直到没有数据留下,但是由于Web服务是无状态的,这意味着我必须保留一些ID号,并处理相关的权限。这意味着我不必将整个数据集加载到Web服务器的内存中,这是一件好事。
因此,如果任何人知道一个更好的方法来检索大量的数据(以表格格式)在一个N ASMX网络服务,请让我知道!
6条答案
按热度按时间nwwlzxa71#
几年前我们有过这样的商业场景,我来告诉你我们是怎么做的。
1.尝试限制传输的数据量
1.如果要传输n个表,则将它们拆分为n个数据表,每次传输一个数据表。
1.在传输之前压缩数据集/数据表。这会产生巨大的影响。另一方面,将字节流重新转换为数据集/数据表。也不要使用.NET内置的压缩-使用SharpZipLib。它会提供更好的结果。
1.此外,您可以异步执行传输,以防止客户端锁定。
我们的客户多年来一直使用上述解决方案,没有任何问题。
x0fgdtte2#
我怀疑您只是想异步调用Web服务,这样您的应用程序在运行时就不会在UI上阻塞。
yrdbyhpb3#
请参阅MSDN Library中的“Large Data and Streaming“。
如果您对大数据传输的性能感兴趣,请不要使用ASMX Web服务。
vfwfrxfs4#
我推荐WCF数据服务(或者现在叫它什么)。你可以公开一个oData端点(如果你在Web服务的两端都有.NET),它为你提供了透明的请求节流(服务器限制单个调用中的响应数量,客户端根据需要自动发出额外的请求)。它还为你提供了一个
IQueryable
风格的接口,非常灵活。cyej8jka5#
我建议将任务卸载到SSRS,它可以毫无问题地处理长时间运行的查询。您可以使用报表生成器构建报表,然后使用.NET应用程序调用SSRS Web服务运行报表并将结果以Excel格式导出(作为字节数组)。请参阅this page以获取使用.asmx服务的示例代码,以及this page以使用WCF调用SSRS。
您还应该在单独的线程中调用您的Web服务,以避免占用UI。
rvpgvaaj6#
这个问题很常见:你有很多数据要返回给用户。
如果你幸运的话,你可以通过增加Webservice超时来逃脱。否则,一次返回一个页面的数据给用户的解决方案符合你的要求吗?在这种设计中,调用者将负责指定起始页面,以及每页有多少行数据给你的Webservice。
参见Pagination Queries和Pagination tips
但是,如果您不限于使用Web服务作为解决方案,那么您可能希望研究向用户提供Reporting Services。绝对值得您研究此替代选项:)