我正在构建一个用于上传文件的mvc 4应用程序。当我获得HttpPostedFileBase范围时,我会获取它们的流并传递到我的业务逻辑层以保存它们并与数据库记录绑定。这没有任何问题。但是当显示上传进度的当前状态时,我有点困惑。我在上传运行时发出第二个请求,但它等待第一个请求完全执行。
我知道在同一个浏览器客户端实例(实际上是同一个会话)中,我的请求是同步的。但是我有一个解决方案,即异步操作。
要尝试异步操作,我使用Stream.CopyToAsync(..)
代替Stream.CopyTo(..)
。我还使用Task.Delay(10000)
来模拟文件上传进度。然后,当异步 UploadFile操作运行时,我在同一浏览器实例上调用了同步 UploadProgress。结果仍在等待第一个请求完成。以下是我使用的代码。我哪里错了?
以下是上传文件的异步操作;
[HttpPost]
public async Task<ActionResult> Upload(PFileUploadModel files)
{
if (!Session.GetIsLoggedIn())
return RedirectToAction("Login", "User");
var fileRequest = Session.CreateRequest<PAddFileRequest, bool>(); //Creates a business logic request
fileRequest.Files.Add(...);
var result = await Session.HandleRequestAsync(fileRequest); //Handles and executes a business logic request by checking authority
if (result)
return RedirectToAction("List");
return RedirectToError();
}
上传进度操作现在简单如下:):
public ActionResult UploadProgress()
{
//var saveProgressRequest = Session.CreateRequest<PSaveFileProgressInfoRequest, PSaveFileProgressInfoResponse>();
//saveProgressRequest.ProgressHandle = progressHandle;
//var response = Session.HandleRequest(saveProgressRequest);
return Content("Test!");
}
感谢您的帮助。
答案 0 :(得分:1)
async
不会更改HTTP协议。在您返回结果之前,Upload
请求正在进行中。
您可能正在进入ASP.NET会话锁,ensures that multiple request handlers don't interfere with each other when reading/writing session state。我相信默认情况下MVC总是对会话状态进行写锁定,防止任何其他操作同时执行(在同一个会话中)。
您可以通过在控制器上指定SessionState
attribute来覆盖此行为。