2012-10-04 44 views
3

我目前正在研究利用的异步/ AWAIT功能:写一个异步控制器和更新进度

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

为了实现这一点,我将使用Json异步更新页面/进度条。

我预见到的问题是这样的:

当我打电话提交去一个控制器,我需要为每个呼叫的响应。我不知道该文件中有多少个调用,直到我已经提交了该文件并完成了一些处理(以确定每个调用节点)。是否有一个干净的方法来获得我添加到列表中的每个已完成项目的回复?

回答

8

不幸的是,asyncawait不能这样做。正如我在我的博客上解释的,async does not change the HTTP protocol;每个请求都会得到一个响应,就是这样。

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

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

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

2

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

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

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

想想你会发现使用现有的MVC上传扩展更容易,所以不需要重新发明轮子,我的想法任何方式:-)