【问题标题】:Cannot access a closed Stream when returning FileStreamResult from C# .NetCore API从 C# .Net Core API 返回 FileStreamResult 时无法访问已关闭的 Stream
【发布时间】:2020-08-05 12:14:01
【问题描述】:

C# .Net-Core 3.1

在我的 C# api 中,我在 FileStreamResult 中返回一个 pdf 文件,效果很好。

通常我将流包装在使用中,但是这段代码失败了 Cannot access a closed Stream.

using (MemoryStream stream = new MemoryStream(byteArray))
{
    fileStreamResult = new FileStreamResult(stream, "application/pdf");
}
return (ActionResult)fileStreamResult;

所以我需要这样做:

var stream = new MemoryStream(byteArray);
fileStreamResult = new FileStreamResult(stream, "application/pdf");
return (ActionResult)fileStreamResult;

我假设流需要保持打开状态,我应该担心内存泄漏还是 IIS 会关闭流?有更好的选择吗?

【问题讨论】:

  • 在内部 FileStreamResult 实现了一个 using 块。所以你不必担心。

标签: c# .net-core using memorystream filestreamresult


【解决方案1】:

为什么要把return (ActionResult)fileStreamResult; 放在外面使用block?

【讨论】:

  • 我把它放在里面,但也遇到了同样的错误,所以我把它移了出来。
【解决方案2】:

Using 语句关闭并从 using 语句中设置的内存中卸载变量,这就是尝试访问关闭的内存流时出错的原因。如果您只是要在最后返回结果,则不需要使用 using 语句。

Using 语句有助于为您从内存中删除数据,但您始终可以使用 .dispose() 自行处理数据

【讨论】:

  • 我最终将其转换为使用FileContentResult,它接受字节数组,因此我不需要打开内存流。
  • @kpg 只是为了让您知道流只是深层的字节数组。流只是提供一些有用的扩展。您仍然需要确保清理字节数组,否则您可能会使用所有应用程序的内存来保存字节数组
猜你喜欢
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多