高效地从asp.net core发送文件

Bra*_*tty 8 c# asp.net response.transmitfile asp.net-web-api asp.net-core

我有兴趣将一些代码移植到 ASP.NET Core,并想知道从 ASP.NET Core Web 服务发送文件(也称为“下载”文件)的最有效方法。

使用旧的 ASP.NET 代码,我使用的是 FileStream:

var content = new FileStream(
    myLocation,
    FileMode.Open, FileAccess.Read, FileShare.Read);

var result = new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(content)
};
Run Code Online (Sandbox Code Playgroud)

但是,我试图找到与 FreeBSD 的 sendfile() 等效的 .NET 并找到HttpResponse.TransmitFile。我认为这会更快?

我还担心该文件在访问用户之前必须从 Kestrel 跳到 IIS。有什么建议吗?

Pra*_*mar 8

如果您的意思是将文件流式传输到客户端,则可以使用 FileResult 作为返回类型。

public FileResult DownloadFile(string id) {
    var content = new FileStream(myLocation,FileMode.Open, FileAccess.Read, FileShare.Read);
    var response = File(content, "application/octet-stream");//FileStreamResult
    return response;
} 
Run Code Online (Sandbox Code Playgroud)

FileResult 是所有文件相关操作结果的父级,例如 FileContentResult、FileStreamResult、VirtualFileResult、PhysicalFileResult。请参阅 ASP.NET Core ActionResult 文档。

  • 与 TransmitFile 不同,这会将文件缓冲在内存中,对吗?那会让它变慢吗?我的理解是 TransmitFile 将直接将文件写入套接字,而不会在内核和用户空间之间缓冲内存,就像使用 C/C++ 在 OSX/FreeBSD 上的 SendFile 一样。 (3认同)
  • 是的,它确实。但有更好的方法来处理它,有一个不错的博客,对我的情况非常有用 https://blog.stephencleary.com/2016/11/streaming-zip-on-aspnet-core.html 希望有帮助。 (2认同)