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

时间:2011-03-18 17:00:56

标签: asp.net-mvc asp.net-mvc-3 asynchronous

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

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

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

提供异步反馈
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");
}

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

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

1 个答案:

答案 0 :(得分:3)

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

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

但是,一旦“成功”返回到浏览器(表示上传已成功完成),您的页面将定期轮询“状态”URL,可能是1或2秒(取决于您对这些进程的预期时间)采取。)

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

状态URL会返回一个指示符,指示应该重新检查状态,或者返回成功以及指向亚马逊缩略图(或您网站上的网址)的URL。重新检查,直到检查完最后一步。