在MVC 2应用程序中创建非阻塞进程

时间:2010-09-04 00:53:50

标签: .net asp.net-mvc asp.net-mvc-2 asynchronous

我面临着设置一个允许用户进行以下操作的系统:

  1. 点击按钮初始化“download& archive”命令,该命令通过XML读取文件列表,通过HTTP将文件拉到本地目录,对其进行存档,然后将其存储下载。
  2. 按下上述按钮后,获取一个进度条/指示器告诉他们“请求正在处理”立即
  3. 能够提交另一个“download& archive”命令,而无需等待之前的请求完成。
  4. 当每个“download& archive”命令完成时,已完成的存档池应该增加1,新存档可供下载。
  5. 我应该如何跟踪在步骤1中发生的正在进行的过程,以及如何根据步骤2和4的要求将正确的事件/消息传回UI;

    用户界面如何了解正在进行的流程?文件系统上的魔术文件夹和令牌?会话状态?由进程写入并由前端代码读取的数据库?

    我想知道这是否经常遇到并且有“标准方式”实施?

    仅供参考,我的筹码是:

    • .NET 4上的ASP.NET MVC 2
    • IIS 7
    • .NET的外部7zip库

1 个答案:

答案 0 :(得分:2)

在客户端(在您的情况下是MVC控制器)创建一个具有标识的显式Command对象(很可能是GUID)。然后通过生成新线程或通过ServiceBus向后端进程发送单向消息,并将命令ID返回到View。

当您的后端进程正常工作时,View可以使用JavaScript进行轮询以查找是否存在URI。 例如http://www.mysite.com/asyncresults/GUID.js

然后,您的后端进程可以使用JSON对象在文件系统上创建GUID.js,这些对象为您提供足够的信息来呈现进度更新。

当客户端轮询文件时,它将收到404,直到该文件存在。当您收到200时,您可以使用包含的JSON来呈现您的UI。

此解决方案可扩展且易于实施。