从动作返回文件时,流是否会被处置?

我正在写一个字符串到MemoryStream我需要将流返回到Controller Action,所以我可以将其作为文件发送下载。

通常,我将Stream包装在using语句中,但是,在这种情况下,我需要返回它。 我退货后还能处理吗? 或者我需要以某种方式自行处理它?

 //inside CsvOutputFormatter public Stream GetStream(object genericObject) { MemoryStream stream = new MemoryStream(); StreamWriter writer = new StreamWriter(stream, Encoding.UTF8); writer.Write(_stringWriter.ToString()); writer.Flush(); stream.Position = 0; return stream; } 

Controller返回文件的Action:

 [HttpGet] [Route("/Discussion/Export")] public IActionResult GetDataAsCsv() { var forums = _discussionService.GetForums(_userHelper.UserId); CsvOutputFormatter csvFormatter = new CsvOutputFormatter(new CsvFormatterOptions()); var stream = csvFormatter.GetStream(forums); return File(stream, "application/octet-stream", "forums.csv"); //is the stream Disposed here automatically? } 

根据源代码这里aspnetwebstack / src / System.Web.Mvc / FileStreamResult.cs

 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); } } } 

FileStream将在您调用时传递的流

 return File(stream, "application/octet-stream", "forums.csv"); 

更新。

您的问题最初被标记为Asp.Net MVC,但代码看起来像是最新的核心框架。

在那里找到它虽然写得不同但它在技术上做同样的事情。

ASPNET / MVC / BLOB的/ dev / src目录/ Microsoft.AspNetCore.Mvc.Core /基础设施/ FileStreamResultExecutor.cs

 private static async Task WriteFileAsync(ActionContext context, FileStreamResult result) { var response = context.HttpContext.Response; var outputStream = response.Body; using (result.FileStream) { await result.FileStream.CopyToAsync(outputStream, BufferSize); } }