.Net Core异步文件结果

joh*_*y 5 4 c# file .net-core asp.net-core

在ASP.Net Core中,建议的返回文件的方法是通过来获得访问权限,PhysicalFileProvider这提供了额外的安全性,包括限定目录及其子目录的所有路径。目前,我的整个应用程序都是Async,我希望所有方法保持不变。

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

编辑 事实证明,通过获取文件PhysicalFileProvider不是我想要异步的,我真的希望Stream被异步读取。

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

Evk*_*Evk 6

PhysicalFileProvider完全能够异步读取文件。GetFileInfo返回有关文件的信息,此处无需执行任何异步操作。类似于new FileInfo("path")

CreateReadStream获取目标文件的句柄,类似于File.OpenRead()。再说一遍-这里什么都不应该是异步的,这与您是否正在使用PhysicalFileProvider无关。

当您拥有文件流时,您可以像往常一样异步读取(ReadAsync依此类推),无论您如何获取它。实际上,PhysicalFileProvider.CreateReadStream即使打开带有正确标志(FileOptions.Asynchronous)的文件,也使该流非常适合异步访问(而不适合非异步访问)。

就您而言,尽管您不需要自己读取该文件流。您正确地将其退回

return File(fileStream, mimeType, "ProfilePicture.png");
Run Code Online (Sandbox Code Playgroud)

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

简而言之-只需签名即可

public FileResult GetFileById(int id)
Run Code Online (Sandbox Code Playgroud)

你会没事的。异步应该完成操作已经在此代码中异步完成了。

  • @johnny5 正如我在回答中所说的那样,它已经被读取和写入响应异步,你不需要等待任何东西。`return File(stream)` 返回 `FileStreamResult`,asp.net 在其上执行 `await result.ExecuteAsync()`。所以asp.net 会为你做这些。 (2认同)