【发布时间】:2020-02-09 23:48:01
【问题描述】:
我有这个方法。
[HttpGet("view/{fileId}/{width}/{height}/{name}")]
public async Task<FileStreamResult> View(Guid fileId, int width, int height, string name)
{
var fileInfo = await _fileViewer.GetImageInfo(fileId, width, height);
FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open);
return File(f, fileInfo.MimeType);
}
这只是将一个调整后的图像返回给浏览器。有用。但据我所知,它会泄漏内存。
FileStream f 永远不会被释放。
我可以看到我的服务器内存正在慢慢用完。
如果我在其中添加using 语句,我会收到流已关闭的错误,即在文件返回给用户之前使用语句关闭。
这应该如何正确完成?
更新 1。 这个:
using (FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open))
{
return File(f, fileInfo.MimeType);
}
产量
System.ObjectDisposedException:无法访问已处置的对象。 对象名称:'无法访问已关闭的文件。'。
【问题讨论】:
-
能否包含您为
using语句实现的代码?显然,正确的答案是显式调用Dispose()或将FileStream包装在using语句中,但我们需要评估为什么您的using语句不起作用。 -
您可以尝试将流复制到字节数组并使用 File 方法的另一个重载。在这种情况下,您可以在请求结束之前关闭流。
-
@pwrigshihanomoronimo 我试过了,它也可以,但我更愿意将文件流式传输给用户。我可能是错的,但我认为这样它不会被加载到 RAM 中。
-
如果您的假设是正确的,那么在他们的应用程序中使用此构造的每个人都会遇到内存泄漏。既然不是,我想你会发现不是这种方法导致内存泄漏。
-
This 是您传递给
File方法的Stream被清理的地方。
标签: c# asp.net-core asp.net-core-3.0