ASP.NET Core 中的 File()、PhysicalFile()、PhysicalFileResult() 有什么区别?

9 c# asp.net-core asp.net-core-webapi asp.net-core-3.0 asp.net-core-3.1

我正在尝试使用 ASP.NET core 3.1 构建一个 Web API 端点,这将允许应用程序向我发送一个 id,并且响应将与相应的文件一起发送。

这是我的方法

[HttpGet("get")]
public IActionResult Get(Guid id)
{
    FoundFileInfo file = PathFinder.Get(id);

    if(file == null || !System.IO.File.Exists(file.Fullname))
    {
        return NotFound();
    }

    return File(file.Fullname, "image/jpeg");
}
Run Code Online (Sandbox Code Playgroud)

使用相同的代码,我可以返回File(file.VirtualName, "image/jpeg"), new PhysicalFileResult(filename, "image/jpeg"), 或PhysicalFile(filename, "image/jpeg")。但是它们之间有什么区别,每个的正确用例是什么?

我的最终目标是允许消费者根据端点的响应构造一个IFileInfo实例。不知何故,我想为消费者提供足够的信息,例如LastModified, Length, Name, PhysicalPath。哪种方法适合我的案例?

Wik*_*hla 10

.NET CoreFile仅处理虚拟路径(相对于您的网站)。该PhysicalFile手柄物理(绝对)文件路径。

PhysicalFile只是一个返回PhysicalFileResult. 但是您可以使用new PhysicalFileResult.

我认为没有其他区别,选择主要取决于您如何获得要返回的文件的位置。如果您同时拥有虚拟位置和物理位置,则可以选择两者中的任何一个(FilePhysicalFile)。

  • 根据[文档](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.physicalfileresult?view=aspnetcore-5.0),“PhysicalFile”变体可以通过“更有效”使用主机提供的机制。` 这意味着 Windows 上的 [TransmitFile](https://learn.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-transmitfile) 和 [sendfile](https Linux 上的 ://man7.org/linux/man-pages/man2/sendfile.2.html)。 (2认同)