我有一個web api GET方法,它返回一個用於下載的zip文件。下面是一個創建zip壓縮代碼:創建和下載zip壓縮文件時的內存使用情況爲HttpContent
var resultStream = new MemoryStream();
using (var zipArchive = new ZipArchive(resultStream, ZipArchiveMode.Create, leaveOpen: true))
{
foreach (var file in files)
{
zipArchive.CreateEntryFromFile(file.Path, file.Name, CompressionLevel.Optimal);
}
}
而這裏的反應如何被填充:
var response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new ByteArrayContent(resultStream.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = "export_" + DateTime.Now.ToString("dd-MM-yyyy_HH-mm-ss") + ".zip";
response.Content.Headers.ContentDisposition.CreationDate = DateTime.Now;
response.Content.Headers.ContentDisposition.Size = resultStream.Length;
response.Content.Headers.ContentLength = resultStream.Length;
上面的代碼工作得很好,但問題是它消耗大量的內存在服務器上,當然取決於文件大小。我嘗試將結果更改爲StreamContent
,但是這不起作用,因爲響應只返回標題並最終超時。
因此,這裏是我的問題:
- 有沒有一種方法,以避免加載在內存中的所有文件,而是因爲它被創建發送壓縮文件?
- 更好地使用StreamContent在這種情況下使用,如果是的話,我需要改變什麼才能使它工作?
- 在每種情況下緩衝如何影響內存消耗?我已經嘗試通過執行自定義
IHostBufferPolicySelector
來禁用緩衝,建議in this article,但它似乎沒有任何效果。 - 目前可以通過導航鏈接,使用HttpClient或AJAX請求來調用api操作,因此任何解決方案都必須支持所有場景。
嘗試使用GZipStream和PushStreamContent –
您在服務器上獲得了多少請求? –
儘管如此,您將無法設置內容長度,因此需要啓用塊編碼。 –