ASP.NET MVC 3为浏览器提供大文件下载,而服务器从其他地方检索文件

时间:2011-10-28 23:03:13

标签: asp.net-mvc download httphandler

我需要提供文件下载功能,其中Web服务器从另一个源(通过HTTP)检索文件,并同时将其流式传输到浏览器。我猜测使用MVC的Controller.File ActionResult不起作用,但无论如何我写了这样的原型:

public ActionResult Download()
{
    HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create("http://somewhere/somefile.pdf");
    HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
    Stream stream = webResponse.GetResponseStream();
    var mimeType = "application/pdf";
    var fileName = "somefile.pdf";
    return File(stream, mimeType, fileName);
}

这很好用,但是在return语句之后无法在HttpWebResponse和Stream上调用Close()。 HttpWebResponse.GetResponseStream方法上的help说:“您必须调用Stream.Close或HttpWebResponse.Close方法来关闭流并释放连接以便重用。没有必要同时调用Stream.Close和HttpWebResponse.Close,但这样做不会导致错误。无法关闭流将导致您的应用程序用完连接。“

我是否应该创建一个HttpHandler并从源流中手动读取字节并将其写入响应,沿thisthis行?还有其他方法我不知道吗?

1 个答案:

答案 0 :(得分:0)

虽然我并不是直接熟悉尝试类似这样的东西,但我的第一个问题就是你在流中读取,关闭连接,然后返回字节作为响应。作为一个流,我不知道如何将它打开以便像在原型中那样返回其内容,但是当你完成时可以关闭它。