我可以在以下场景中使用异步控制器吗?

时间:2011-07-03 22:53:47

标签: asp.net-mvc-2 polling long-running-processes asynccontroller

我在Asp.net MVC中有一个应用程序,在某些时候我想向用户显示一个模式对话框,显示进程执行进度指示器。

幕后的过程会进行大量的数据库数据处理(基于现有数据,它会生成大量结果记录,并将其写回数据库)。流程可能需要从短暂时间到很长时间(取决于现有数据)。

应用程序将异步启动此过程(通过Ajax请求)并以相同方式显示进度。

问题

我已经阅读了一些关于异步控制器的内容,其中一个可以异步启动一个进程,并会告知它的结束,但是没有进度指示,我不确定如何处理浏览器超时。就客户端而言,异步请求与同步请求相同。因此,客户将等待响应(据我所知)。主要区别在于服务器将以异步方式执行某些操作,因此它不会阻止其他传入请求。我应该做的是:

  1. 发出启动流程并响应客户端taht流程的请求已经开始。
  2. 客户端会定期轮询服务器以获取进程进度状态,并立即回复百分比值(可能是JSON)
  3. 如果进度为100%,则意味着它已结束,因此客户知道要求结果。
  4. 我不相信异步控制器以这种方式工作......

    问题是我不确定我是否理解异步控制器,因此我不确定应该使用哪种方法来解决这个问题?我自己也看到了两种可能性:

    1. Asp.net MVC异步控制器,如果他们可以这样工作
    2. 根据请求处理数据并报告其进度的Windows服务应用程序 - 通过使用正常的控制器操作将特定记录写入数据库来启动此服务;将启动它,然后服务将其进度状态写入数据库,以便我的Asp.net MVC应用程序能够在客户端进程轮询请求上读取它。

1 个答案:

答案 0 :(得分:1)

我没有在项目中使用过Asynch控制器。但是这里有一个链接到有人。

asynchronous-processing-in-asp-net-mvc-with-ajax-progress-bar

我个人在大型制作项目中使用过Number 2。

Number 2是在单独的服务器上运行的服务应用程序,使用OpenSSH在两台服务器之间进行通信。我们会定期轮询进度以通过AJAX将进度条更新到客户端UI。

此外,通过将您的网络服务器与长时间运行的流程分开,您将分离您的疑虑。您对Web服务器不感兴趣将文件写入磁盘,处理IO等,因此不应对此负责。

如果您的长时间运行过程必须被终止或失败,那么这不会影响您的Web服务器处理请求和处理事务。

另一个建议是,一个极长的运行过程不会给客户带来等待负担,给他们一个选项,以便稍后回来查看进度。即完成后给他们发电子邮件。

或者实际上向他们展示一些有趣的东西,在我们的例子中,我们有一个签名的Java Applet显示他们的流程在那个确切的时刻正在做什么。