关于c#:ASP.Net MVC长期运行流程

ASP.Net MVC Long Running Process

我需要为不同的财务周期生成一个报告屏幕。因为这是一个很大的数据集,有很多规则,所以运行这个过程可能需要很长时间(对于一些报告来说,要返回一个多小时)。

在MVC中处理这个场景的最佳方法是什么?

我担心:

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


这些确实是值得关注的问题。

正如一些评论者已经指出的那样:如果报告不依赖于用户的输入,那么您可能希望提前生成报告,例如,在夜间生成报告。

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

  • 让浏览器发出请求,启动生成报告的过程。您可以启动一个新线程并告诉它生成报告,也可以将"创建报告"消息放在队列上,让服务使用消息并生成报告。无论您做什么,请确保第一个请求很快完成。它应该返回某种标识刚刚开始的任务的标识符。此时,您可以通知用户系统正在处理请求。
  • 使用Ajax可以使用给定的标识符重复轮询服务器以完成报告。最好,生成报告的过程应该报告其进度,并且应该通过Ajax轮询向用户提供这些信息。如果你想变得花哨,可以使用信号器通知浏览器进度。
  • 准备好报告后,返回一个指向用户的链接,用户可以在其中访问报告。
  • 根据您如何实现这一点,用户可能能够关闭浏览器,喝一口咖啡,然后返回完整的报告。


    如果您的应用程序在Windows服务器上与IIS一起运行,则您的ASP.NET代码可以在DB表中创建一条记录,这意味着应该创建该报告。

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

    如果您在Windows Azure云上运行,则可能使用WebWorker而不是Windows服务。

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