ASP.Net MVC长期运行流程

我要求为不同的财务期制作报告屏幕。 由于这是一个包含大量规则的相当大的数据集,因此该过程可能需要很长时间才能运行(一些报告返回的时间超过一小时)。

在MVC中处理这种情况的最佳方法是什么?

我担心:

  • 屏幕锁定
  • 性能
  • 可用性
  • 请求超时

这些确实是有效的问题。

正如一些评论者已经指出的那样:如果报告不依赖于用户的输入,那么您可能希望事先生成报告,比如每晚报告。

另一方面,如果报告确实依赖于用户的输入,您可以通过多种方式规避您的疑虑,但至少应该将操作拆分为多个步骤:

  1. 请求浏览器启动生成报告的过程。 您可以启动一个新线程并告诉它生成报告,或者您可以在队列上放置“创建报告”消息并让服务使用消息并生成报告。 无论您做什么,请确保第一个请求快速完成。 它应该返回一些标识刚刚开始的任务的标识符。 此时,您可以通知用户系统正在处理请求。
  2. 使用Ajax重复轮询服务器以使用给定标识符完成报告。 优选地,生成报告的过程应该报告其进度,并且该信息应该通过Ajax轮询提供给用户。 如果您想获得想象力,可以使用SignalR通知浏览器进度。
  3. 报告准备就绪后,返回指向他/她可以访问报告的用户的链接。

根据您的实施方式,用户可以关闭浏览器,喝一口咖啡然后回到完整的报告中。

如果您的应用程序在带有IIS的Windows Server上运行,您的ASP.Net代码可以在db表中创建记录,这意味着应该创建报告。

然后,您可以使用可能在同一服务器上运行的Windows服务或控制台应用程序,并不断检查表中是否有新字段。 此服务将创建一个报告,在创建过程中,它应更新表字段以指示进度。 您的ASP.net页面可能正在显示进度条,使用ajax请求从db获取进度指示,或者只是每隔几秒刷新一次页面。

如果您在Windows Azure云上运行,则可以使用WebWorker而不是Windows Service

对于页面上的屏幕锁定,您可以使用jquery Block-UI库