c# - .Net Core 异步文件结果

标签 c# file asp.net-core .net-core

在 ASP.Net Core 中,推荐的返回文件的方法是通过 PhysicalFileProvider 获得访问权限,这提供了额外的安全性,包括将所有路径的范围限定到一个目录及其子目录。目前我的整个应用程序都是异步的,我希望我的所有方法都保持这种状态。

public static string BASE_PATH = Path.GetTempPath();
public static string lastSavedFilePath = @"C:\Users\MyUser\AppData\Local\Temp\MyPicture.png"

[HttpGet("{id}")]
public async Task<FileResult> GetFileById(int id)
{
    //provides access to the physical file system, scoping all paths to a directory and its children
    IFileProvider provider = new PhysicalFileProvider(BASE_PATH);
    var fileInfo = provider.GetFileInfo(lastSavedFilePath);
    var fileStream = fileInfo.CreateReadStream();
    this._contentTypeProvider.TryGetContentType(lastSavedFilePath, out var mimeType);
    return File(fileStream, mimeType, "ProfilePicture.png");
}

编辑 原来通过PhysicalFileProvider获取文件并不是我想要异步的,我真的希望Stream是异步读取的。

我如何确保在调用我的文件操作时它会异步读取我的流?

最佳答案

PhysicalFileProvider 完全能够异步读取文件。 GetFileInfo 返回有关文件的信息,这里没有什么应该异步完成的。它类似于 new FileInfo("path")

CreateReadStream 获取目标文件句柄,类似于File.OpenRead()。再次声明 - 这里不应该是异步的,也不是您是否使用 PhysicalFileProvider

当你有文件流时 - 你可以像往常一样异步读取它(ReadAsync 等等),不管你是如何获得它的。事实上,PhysicalFileProvider.CreateReadStream 甚至可以使用正确的标志 (FileOptions.Asynchronous) 打开文件,使该流非常适合异步访问(而不适合非异步访问)。

在您的情况下,您不需要自己读取该文件流。你用

正确地返回它
return File(fileStream, mimeType, "ProfilePicture.png");

这已经为您异步读取该文件并将其写入 http 响应流。这是因为所有 ActionResult,包括您返回的 FileStreamResult,都有 Task ExecuteAsync 方法来实际执行该结果。 Asp.net 将为您执行 await yourFileResult.ExecuteAsync()ExecuteAsync 会将文件流异步复制到 http 响应。

所以简而言之 - 只需签名

public FileResult GetFileById(int id)

你会没事的。应该异步完成的已经在这段代码中异步完成了。

关于c# - .Net Core 异步文件结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49630173/

相关文章:

c# - 如何在 ASP.NET Core 中返回存储为 byte[] 的文件?

c# - 在不装箱的情况下将字节数组复制到通用类型

c# - 使用 C# 将 SSL 证书自动安装到 IIS 6 站点

c# - 命名空间 'Device' 中不存在类型或命名空间名称 'System'

file - Blackberry 上的最大文件名长度

java - 将字体文件作为 File 对象获取或获取其路径

sql-server - 使用 EF Core 从数据库获取数据时忽略实体的额外属性

c# - 我可以在一个环境中使用不同的配置运行两个 TestServers 吗?

c# - 禁用对读取(无效的 JSON)单引号字符串的支持

python - 使用不同的扩展名轮换日志