4

我目前正在考虑使用 async/await 功能来:

  1. 提交文件。
  2. 例如,此文件可能包含一个或多个条目。(例如,可以是一个只有一个元素的 XML 文件,或者每个文件可以列出多个节点)
  3. 我需要单独处理每个呼叫,将其添加到已完成项目列表中,并将进度作为单个任务完成后返回。(已完成:0/2 ----> 已完成 1/2...)
  4. 这需要发送回视图,以便使用此功能的任何人都可以看到单个呼叫已被导入。

为此,我将使用 Json 异步更新页面/进度条。

我预见的问题是这样的:

当我调用提交以转到控制器时,我需要对每个单独的调用做出响应。在我提交文件并已经完成一些处理(以确定每个呼叫节点)之前,我不知道文件中有多少呼叫。是否有一种干净的方法可以为我添加到列表中的每个已完成项目获得响应?

4

2 回答 2

9

不幸的是,async无法await做到这一点。正如我在博客上解释的那样,async不会更改 HTTP 协议;每个请求你都会得到一个响应,就是这样。

因此,当文件被提交时,为该文件创建某种标识符并将其提交到持久后台队列进行处理。您可以使用轮询/长轮询/websockets/SignalR 来通知客户端进度。

请注意,ASP.NET 假定如果没有未完成的请求,您的进程可以被回收,因此处理应该由MVC 控制器以外的其他东西完成。类似于 Win32 服务或 Azure 辅助角色。

此外,如果这是针对 Web 场中的站点,则需要可从所有 Web 服务器访问您的持久队列。如果你在 Azure Web 角色上托管,它不能在磁盘(或 MSMQ)上,因为 Azure 将回收你的整个计算机 - 在这种情况下,它应该在 Azure 存储或服务总线中。

于 2012-10-04T22:23:08.700 回答
2

不确定您的确切要求是什么,但您可以使用现成的上传控件,例如 Telerik MVC 上传扩展及其免费!

http://demos.telerik.com/aspnet-mvc/upload

或者您可以自定义滚动自己的;我在想的是,当用户上传 xml 文件/文件时,控制器方法可以将它们放入后台队列中进行处理,或者将其交给负责处理并返回票号的 Windows 服务客户端。公开另一个 webservice/restful 服务,该服务提供通过票号查询的文件上传的进度/状态,并让您的客户端/网站每隔一段时间查询 web 服务以获取进度并向用户显示进度。

认为您可能会发现使用现有的 MVC 上传扩展更容易,所以不需要重新发明轮子,我的想法是 :-)

于 2012-10-04T22:46:39.823 回答