【问题标题】:Efficiently sending files from asp.net core从 asp.net core 高效发送文件
【发布时间】:2017-12-12 06:38:35
【问题描述】:

我有兴趣将一些代码移植到 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)
};

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

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

【问题讨论】:

  • 文件在哪里——文件系统还是数据库?
  • @Win,文件位于文件系统中。
  • @BrandonPetty 你找到好的性能解决方案了吗?
  • @Wahid,该项目已被搁置。我无法进一步调查。我打算让 Web 服务器而不是 Web 服务来提供这些文件。我只需要提供一个自定义的身份验证/权限插件。这也解决了多个线程以块的形式请求的流式内容的问题。例如,如果服务位于 IIS 之后,这也可以避免额外的跃点。我还没有研究这将如何与 Azure 存储一起使用。我的需求只是基于安全性。
  • 我想详细说明我之前的评论。如前所述,我们不再通过 .net 核心 API 发送文件。我建议反对它。相反,我们使用指向 AWS S3 对象的共享密钥创建签名 URL。客户端可以直接使用该 URL 来获取内容。 S3 根据签名授权请求。

标签: c# asp.net asp.net-web-api asp.net-core response.transmitfile


【解决方案1】:

如果您的意思是将文件流式传输到客户端,则可以使用 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;
} 

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

【讨论】:

  • 与 TransmitFile 不同,这会将文件缓冲在内存中,对吗?那会让它变慢吗?我的理解是,TransmitFile 将文件直接写入套接字,而无需在内核和用户空间之间缓冲内存,就像使用 C/C++ 的 OSX/FreeBSD 上的 SendFile。
  • 是的,确实如此。但是有更好的处理方法,有一个不错的博客对我来说非常有用blog.stephencleary.com/2016/11/…希望有帮助。
猜你喜欢
  • 2019-03-09
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 2018-12-25
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多