控制器中作为流下载的文件(ASP.NET MVC 3),会自动释放吗?

3
假设控制器下载选定的文件:
 public FileResult Download( string f ) {

         Stream file = MyModel.DownloadFiles( f );

         return File( file, "application/octet-stream", (file as FileStream).Name );
 }

MyModel 包含以下内容:

public static Stream DownloadFiles(string file){

   return new FileStream(file, FileMode.Open, FileAccess.Read);
}

如果在控制器中使用using关键字,则会抛出异常:无法访问已关闭的文件
我想确认下载的文件是否会被释放(我不知道是否可能,如何做到这一点)?
谢谢。
1个回答

14

Controller.File方法内部使用了FileStreamResult类,该类已经包含了using关键字。

protected override void WriteFile(HttpResponseBase response) {
    // grab chunks of data and write to the output stream
    Stream outputStream = response.OutputStream;
    using (FileStream) {
        byte[] buffer = new byte[_bufferSize];
        while (true) {
            int bytesRead = FileStream.Read(buffer, 0, _bufferSize);
            if (bytesRead == 0) {
                // no more data
                break;
            }
            outputStream.Write(buffer, 0, bytesRead);
        }
    }
}

https://github.com/ASP-NET-MVC/ASP.NET-Mvc-3/blob/master/mvc3/src/SystemWebMvc/Mvc/FileStreamResult.cs


如果我在 DownloadFiles 上进行集成测试,则会失败。为什么我不能在模型中使用 dispose (因为会报“无法访问已关闭的文件”)? - Snake Eyes
1
MVC ActionResult 在离开动作方法后执行。FileStreamResult 需要流保持打开状态,因为它从流中读取数据。所以你不应该在动作方法内关闭流。 - Dmitriy Startsev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接