我目前正在考虑使用async / await功能:
为实现这一点,我将使用Json异步更新页面/进度条。
我预见到的问题是:
当我打电话给提交者去控制器时,我需要对每个呼叫进行响应。在我提交文件并完成一些处理(确定每个Call节点)之前,我不知道文件中有多少个调用。是否有一种干净的方法来获取我添加到列表中的每个已完成项目的响应?
答案 0 :(得分:9)
不幸的是,async
和await
无法做到这一点。正如我在博客上解释的那样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的现有上传扩展更容易,所以不需要重新发明轮子,我的想法无论如何: - )