ASP .NET AJAX中断异步文件传输?

时间:2012-07-17 00:03:30

标签: c# html asp.net-mvc file-upload

我最近开始为客户开发多文件上传HTTP页面。

他希望在HTTP,Javascript和HTML中使用它,需要能够传输大文件(每个最多800兆字节),并且他还想要上传的进度条。 Flash或Silverlight不是可接受的选项,最后,也不接受第三方组件,因为需要严格的可定制性,而不需要太多麻烦。

现在,我得到了整个概念。你有一个主页有一个iframe(ewww,我说的是i-word - 我知道)。此iframe指向form,其中包含文件上传。这样,提交此form后,访问者所在的原始页面将不会重新加载,允许原始页面运行某些AJAX,不断询问传输的进度。

首次尝试

我首先开始在MVC中获取文件,方法是直接将其声明为action方法的参数,如下所示。

public ActionResult UploadFile(HttpPostedFile upload) {
    ...
}

但是MVC给我的帮助就是这个,InputStream属性或SaveAs(...)变量上的upload方法都没有帮助我。

BeginExecute和GetBufferedInputStream

很快我发现.NET 4.0中引入了一个名为HttpRequest.GetBufferedInputStream()的方法。这种方法特别允许我接收文件流并以增量和异步方式读取它。

我覆盖了控制器的BeginExecute方法,并在触发特定网址时将读取功能放在那里,就像这样。

protected override IAsyncResult BeginExecute(System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
    if (requestContext.HttpContext.Request.Url.AbsolutePath.StartsWith("/Home/UploadFile"))
    {
        //we're doing a file upload
        var streamSource = requestContext.HttpContext.Request.GetBufferedInputStream();

        //read from stream, write to file
    }
}

这一切都很好......当AJAX没有进入并中断时。你看,如果我运行了我的AJAX脚本(在iframe上传开始后10秒执行),那么(当它发出GET请求时)该请求会中断正在读取文件的流,即使它处于不同的动作,即使是在不同的控制器上。

我收到的错误如下:

  

客户端已断开连接,因为基础请求已完成。不再提供HttpContext。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

看看ASP .NET Ajax File Upload。这应该说明GetBufferlessInputStream和GetBufferedInputStream如何工作以及如何使用它们进行“ajax”文件上传,但会强制您更改大量代码。

如果您使用的是.NET 4.5,那么使用GetBufferedInputStream的项目的更新版本将很快出现,并且易于使用。您可以查看相同的链接以获取更新。