【发布时间】:2014-07-06 16:18:07
【问题描述】:
我将一个项目从 MVC3 转换为 MVC4,并从 Entity Framework 5 转换为 EF 6.1。在代码中有一个 VBHTML 页面,其中有一个代码部分“使用 Html.BeginForm.... 结束使用”。在此页面中,用户可以选择一个文件并单击提交。这会在控制器中调用 POST 方法。控制器中的方法使用 GData API 的可恢复上传器(异步)将所选文件上传到 Google 驱动器。必须使用 ResumableUploader(上传 PDF 和大文件的 GData API 限制)。现在,这段代码过去在 MVC3 中一直有效。一旦平台更改为 MVC4,就开始出现此异常:
此时无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果在执行 Page 时发生此异常,请确保将 Page 标记为
at System.Web.AspNetSynchronizationContext.OperationStarted() at Google.GData.Client.ResumableUpload.ResumableUploader.AsyncStarter
(AsyncResumableUploadData data, WorkerResumableUploadHandler workerDelegate,
Object userData)
我确实将@Page Async="true" 放在了VBHTML 页面中,但这并没有帮助。我 100% 确定这与 MVC4 和/或 .Net 4.5 有关,因为代码中没有进行其他更改(除了迁移到 MVC4 和迁移到 .Net4.5 之外)。我现在有两个代码分支,一个在 MVC3 上,一个在 MVC4 上。当我编译 MVC3 并在应用程序中复制输出 DLL 时,上述问题并未浮出水面。当我用 MVC4 版本替换该 DLL 时,出现了上述问题。如何处理?
这是导致此问题的代码:
Dim auth As Authenticator = New AuthSubAuthenticator("MyToken", authFactory.Token)
Dim uploader As New ResumableUploader(10485760)
AddHandler uploader.AsyncOperationCompleted, AddressOf UploaderCompleted
uploader.InsertAsync(auth, file, New Object())
跟踪显示异常是从最后一行(uploader.InsertAsync)抛出的
我知道有一个 await 方法可以使用。没有尝试,而是将uploader.InsertAsync 更改为uploader.Insert 并且代码可以正常工作。但是用户必须等到上传完成(对于较大的文件,需要很长一段时间)。
【问题讨论】:
标签: asp.net-mvc-4 asynchronous