异步处理asp.net mvc与客户端进度反馈

jes*_*vin 6 asp.net-mvc asynchronous asp.net-mvc-3

我正在构建一个图像管理工具,我想知道如何创建类似Vimeo的体验.

需要说明的内容
用户将能够使用plupload上传许多可能较大的图像(无页面重新加载).然后,服务器将对每个上载的映像执行以下操作.

  • 图像将调整为多个版本(例如拇指,小,中,大)
  • 每个副本都将完成一些图像处理(例如卷积滤波器)
  • 这些已调整大小的副本将上载到Amazon S3
  • 有关每个图像的信息将存储到数据库(宽度,高度,mimetype,文件名)
  • 然后服务器应该向用户触发某种反馈

提供异步反馈
Plupload(图像上传工具)在将文件上传到我的服务器时有非常好的视觉反馈,但是,我希望能够在服务器进行所有图像处理并上传到远程存储时向用户提供额外的反馈.

Vimeo做得很好.当您上传视频时,它会确认已上传,但随后说"我们正在对您的视频进行编码,请稍候",并且用户界面会提供某种进度指示.

在将图像上传到我的服务器后,我想给用户两种反馈.每次处理图像并上传到S3时,我想:

  • 更新浏览器上的消息,说"已经处理了15张图片中的5张",我想这样做
  • 显示该图像的缩略图.

示例MVC控制器操作

[HttpPost]
public virtual ContentResult Upload(Guid albumId)
{
  foreach (string file in Request.Files)
  {
    HttpPostedFileBase f = Request.Files[file] as HttpPostedFileBase;
    if (f.ContentLength == 0)
      continue;

    var uploadDir = Server.MapPath("~/uploads/"+ albumId);
    var filePath = Path.Combine(uploadDir, Path.GetFileName(hpf.FileName));
    f.SaveAs(filePath);

    // How can I trigger some async task here that would be able
    // to trigger some sort of feedback to the browser when complete?
    SomeAsyncImageProcessor.ProcessImage(albumId, filePath); // ???
  }

  return Content("Success", "text/plain");
}
Run Code Online (Sandbox Code Playgroud)

限制
使用此网络应用的用户将使用最新版本的Chrome.不需要解决跨浏览器问题.我们正在使用asp.net MVC 3和SQL Server 2005

谁能指出我正确的方向?有没有很好的资源来展示我如何能够完成这样的事情?

Pet*_*r J 3

Rsenna 的评论链接到名为 WebSync 的东西,它是基于 .NET 的 Comet 实现。如果您绝对需要异步进程完成时的实时通知,那就太棒了。

但是,我认为老式的民意调查可能足以满足您的情况。SomeAsyncImageProcessor 仍然是一个异步进程(因此您的应用程序不会冻结。)

但是,一旦浏览器返回“成功”(表明上传已成功完成),您的页面就会开始定期(可能是 1 或 2 秒)轮询“状态”URL(取决于您预计这些过程需要多长时间)。 )

对于每个图像,按顺序检查状态 URL。 http://mysite/imageprocessor/status?albumId=guid&stepid=3

状态 URL 要么返回应重新检查状态的指示符,要么返回成功和亚马逊缩略图的 URL(或您网站上的 URL)。重新检查,直到检查完最后一步。