我正在調查用戶上傳文件的項目中可能發生的內存泄漏問題。這些文件通常是用於其他軟件的.zip或.exe壓縮文件。這些文件的平均大小爲80MBASP.NET MVC/WEB API文件上傳:上傳後沒有釋放內存
有一個MVC應用程序,它具有上載文件的界面(View)。該視圖向控制器內的操作發送POST請求。此控制器操作使用與此類似的MultipartFormDataContent獲取文件:Sending binary data along with a REST API request和此:WEB API FILE UPLOAD, SINGLE OR MULTIPLE FILES
在動作中,我得到該文件並將其轉換爲字節數組。轉換後,我用byte []數組發送一個post請求到我的API。
這裏是MVC應用程序代碼,不會說:
[HttpPost]
public async Task<ActionResult> Create(ReaderCreateViewModel model)
{
HttpPostedFileBase file = Request.Files["Upload"];
string fileName = file.FileName;
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
using (var binaryReader = new BinaryReader(file.InputStream))
{
model.File = binaryReader.ReadBytes(file.ContentLength);
}
var fileContent = new ByteArrayContent(model.File);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = file.FileName
};
content.Add(fileContent);
var requestUri = "http://localhost:52970/api/upload";
HttpResponseMessage response = client.PostAsync(requestUri, content).Result;
if (response.IsSuccessStatusCode)
{
return RedirectToAction("Index");
}
}
}
return View("Index", model);
}
使用多種存儲工具,如該調查後:Best Practices No. 5: Detecting .NET application memory leaks 我發現,這條線將文件轉換爲字節數組後:
using (var binaryReader = new BinaryReader(file.InputStream))
{
model.File = binaryReader.ReadBytes(file.ContentLength);
}
內存使用量從70MB +或 - 增加到175MB +或 - 甚至在發送和完成請求之後,內存永遠不會被釋放。如果我繼續上傳文件,內存會不斷增加,直到服務器完全關閉。
我們無法直接從多部分表單發送文件到API,因爲我們需要在(業務需求/規則)之前發送和驗證一些數據。經過研究,我已經使用了這種方法,但內存泄漏問題與我有關。
我錯過了什麼嗎?垃圾收集器應該立即收集內存嗎?在所有可丟棄的對象中,我使用「using」語法,但它沒有幫助。
我也很好奇這種方法上傳文件。我應該以不同的方式做事嗎?
只是爲了澄清,API與MVC應用程序(每個託管在IIS中的獨立Web站點上)分開,並且全部都在C#中。