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希望有所幫助。 –