ASP.NETAJAX中断异步文件传输



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

他想要所有的HTTP、Javascript和HTML,需要能够传输大文件(每个文件高达800兆字节),他还想要一个用于上传的进度条。Flash或Silverlight不是一个可接受的选项,最后,第三方组件也不可接受,因为在没有太多麻烦的情况下,需要深入的可定制性。

现在,我了解了整个概念。你有一个主页,它有一个iframe(ewww,我说了I字——我知道)。这个iframe指向一个上传了文件的form。这样,一旦提交了这个form,访问者所在的原始页面就不会重新加载,从而允许原始页面运行一些AJAX,不断询问传输的进度。

首次尝试

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

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

但是,尽管MVC给了我很大的帮助,但upload变量上的InputStream属性或SaveAs(...)方法都没有帮助我

BeginExecute和GetBufferedInputStream

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

当触发特定的URL时,我覆盖了控制器的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不再可用。

我该怎么办?

看看ASP.NETAjax文件上传。这应该说明GetBufferlessInputStream和GetBufferedInputStream是如何工作的,以及如何将它们用于"ajax"文件上传,但会迫使您更改大量代码。

如果您使用的是.NET 4.5,那么使用GetBufferedInputStream的项目的更新版本很快就会出现,而且使用起来很容易。您可以检查同一链接以获取更新。

最新更新