【问题标题】:Creating a Non-Blocking Process in an MVC 2 Application在 MVC 2 应用程序中创建非阻塞进程
【发布时间】:2011-04-08 02:46:30
【问题描述】:

我面临着建立一个允许用户:

  1. 点击一个按钮来初始化“下载和存档”命令,该命令通过 XML 读取文件列表,通过 HTTP 将文件拉到本地目录,存档,然后存储起来以供下载。
  2. 在按下上述按钮后立即获取一个进度条/指示器,告诉他们“请求正在处理中”。
  3. 能够提交另一个“下载和存档”命令,而无需等待之前的请求完成。
  4. 随着每个“下载和存档”命令的完成,已完成存档的池应该会随着新的存档可供下载而增加一个。

我应该如何跟踪第 1 步中发生的正在进行的过程,以及应如何根据第 2 步和第 4 步的要求将正确的事件/消息传达回 UI?

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

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

仅供参考,我的堆栈是:

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

【问题讨论】:

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


    【解决方案1】:

    在您的情况下是 MVC 控制器的客户端上创建一个显式的 Command 对象,该对象具有一个身份(很可能是一个 GUID)。然后通过生成一个新线程或通过 ServiceBus 向您的后端进程发送一条单向消息,并将 Commands Id 返回给您的视图。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 2013-04-25
      • 2020-12-29
      • 2013-05-24
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      相关资源
      最近更新 更多