在asp net core 3.0中返回文件会泄漏内存

Jen*_*nsB 5 c# asp.net-core asp.net-core-3.0

我有这个方法。

[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);
}
Run Code Online (Sandbox Code Playgroud)

它只是将调整后的图像返回到浏览器。有用。但据我所知它会泄漏内存。

FileStream f永远不会被处置。

我可以看到我的服务器内存正在慢慢耗尽。

如果我using在其中添加一条语句,则会收到流已关闭的错误,即 using 语句在文件返回给用户之前关闭。

这应该如何正确完成?

更新1。这:

using (FileStream f = new FileStream(fileInfo.FilePath, FileMode.Open))
{
    return File(f, fileInfo.MimeType);
}
Run Code Online (Sandbox Code Playgroud)

产量

System.ObjectDisposeException:无法访问已处置的对象。对象名称:“无法访问已关闭的文件。”。

Ali*_*eza 1

我建议您使用 Asp.net Core 文件提供程序,而不是使用 system.IO 手动读取文件。 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/file-providers?view=aspnetcore-3.1

但是如果您不想使用依赖注入并将 fileProvider 注入到控制器中,那么这个技巧应该适合您:

var fileInfo = await _fileViewer.GetImageInfo(fileId, width, height);
var fileName = Path.GetFileName(fileInfo.FilePath);
IFileProvider x = new PhysicalFileProvider(Path.GetDirectoryName(fileInfo.FilePath));
IFileInfo fi =  x.GetFileInfo(fileName);
 // you can use your mime type as second argumant. (fileInfo.MimeType)
return File(fi.CreateReadStream(), MediaTypeNames.Application.Octet , fileName);
Run Code Online (Sandbox Code Playgroud)