编写异步控制器并更新进度

时间:2012-10-04 20:42:39

标签: c# jquery asp.net .net asp.net-mvc

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

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

    我预见到的问题是:

    当我打电话给提交者去控制器时,我需要对每个呼叫进行响应。在我提交文件并完成一些处理(确定每个Call节点)之前,我不知道文件中有多少个调用。是否有一种干净的方法来获取我添加到列表中的每个已完成项目的响应?

2 个答案:

答案 0 :(得分:9)

不幸的是,asyncawait无法做到这一点。正如我在博客上解释的那样async does not change the HTTP protocol;每个请求你得到一个回复​​,就是这样。

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

请注意,ASP.NET假定如果没有未完成的请求,您的流程可以被回收,因此处理应该由其他而不是MVC控制器完成。像Win32服务或Azure辅助角色一样。

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

答案 1 :(得分:2)

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

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

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

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

相关问题