1

我有兴趣将一些代码移植到ASP.NET Core,并希望知道从ASP.NET Core Web服务发送文件(即“下载”文件)的最有效方式。从asp.net核心有效发送文件

和我的老ASP.NET代码,我用一个FileStream:

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

var result = new HttpResponseMessage(HttpStatusCode.OK) 
{ 
    Content = new StreamContent(content) 
}; 

不过,我试图找到.NET相当于FreeBSD的的sendfile(),发现HttpResponse.TransmitFile。我认为这会更快?

我还担心该文件将不得不在击中用户之前从Kestrel跳出到IIS。有什么建议?

+0

文件位于何处 - 文件系统或数据库? – Win

+0

@Win,该文件位于文件系统上。 –

回答

0

如果是指将文件传输到客户端,则可以使用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文档。

+0

与TransmitFile不同,这将缓冲文件在内存中,是否正确?那会让它变慢?我的理解是,TransmitFile将文件直接写入套接字,而不会在内核和用户空间之间缓冲内存,就像OSX/FreeBSD上的SendFile与C/C++一样。 –

+0

是的,它的确如此。但有更好的交付方式,有很好的博客,在我的情况下非常有用https://blog.stephencleary.com/2016/11/streaming-zip-on-aspnet-core.html希望有所帮助。 –