我继承了一个与Web服务对话的C#.NET应用程序,并且Web服务与Oracle数据库进行通信。我需要向UI添加导出功能,以生成一些数据的Excel电子表格。
我创建了一个Web服务函数来运行数据库查询,将数据加载到DataTable中然后返回它,这对于少量行工作正常。但是,在完整运行中有足够的数据,客户端应用程序锁定几分钟,然后返回超时错误。显然,这不是检索如此大型数据集的最佳方法。
在我开始并提出一些分裂呼叫的狡猾方式之前,我想知道是否已经存在可以处理这个问题的东西。目前我正在考虑一个startExport函数,然后重复调用next50Rows函数,直到没有数据,但因为Web服务是无状态的,这意味着我将不得不保留某种ID号并处理相关权限。这意味着我不必将整个数据集加载到Web服务器的内存中,这是一件好事。
因此,如果有人知道通过aN ASMX Web服务检索大量数据(以表格格式)的更好方法,请告诉我们!
答案 0 :(得分:6)
几年前我们有过这个确切的商业场景,我会告诉你我们做了什么。
我们的客户多年来一直使用上述解决方案,没有问题。
答案 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 Queries和Pagination tips
但是,如果您不仅限于使用webservice作为解决方案,那么您可能希望调查向您的用户提供Reporting Services。绝对值得您研究这个替代选项:)