2

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

幕后的过程进行了大量的数据库数据处理(基于现有数据,它生成大量结果记录,这些记录也被写回数据库)。过程可能需要很短的时间到很长时间(取决于现有数据)。

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

问题

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

  1. 发出一个请求,该请求将启动该进程并响应客户端 taht 进程已启动。
  2. 客户端会定期轮询服务器以获取进程进度状态,并立即以百分比值返回响应(可能为 JSON)
  3. 当进度为 100% 时,这意味着它结束了,因此客户会知道要请求结果。

我不相信异步控制器以这种方式工作......

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

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

1 回答 1

1

我自己没有在项目中使用过异步控制器。但是,这是一个拥有的人的链接。

asp-net-mvc-with-ajax-progress-bar 中的异步处理

我个人在一个大型生产项目中使用过 2 号。

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

此外,通过将您的 Web 服务器与您的长期运行的进程分开,您将关注点分开。您的 Web 服务器对将文件写入磁盘、处理 IO 等不感兴趣,因此不应为此负担。

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

另一个建议是,对于一个运行时间极长的过程,不要让客户承担等待的负担,给他们一个选项,让他们稍后再回来查看进度。即完成后向他们发送电子邮件。

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

于 2011-07-04T00:33:18.913 回答