在ASP.NET MVC應用程序中,我正在通過REST API從SharePoint Online中讀取文件並將其顯示在MVC應用程序的當前瀏覽器窗口中。我有代碼適用於較小的文件,但對於「大文件」(我不知道確切的斷點),我得到一個OutOfMemoryException
。這裏的控制器代碼:OutOfMemoryException當返回FileResult與流
public ActionResult Index() {
System.IO.Stream stream = null;
string fileName = "whatever.ext";
string restUri = $"https://myhost.sharepoint.com/sites/mysite/_api/Web/GetFileByServerRelativePath('mypath/{fileName}')/openbinarystream";
string mimeType = MimeMapping.GetMimeMapping(fileName);
using (var webClient = new WebClient()) {
webClient.Credentials = myCredentials;
webClient.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
var uri = new Uri(restUri);
stream = webClient.OpenRead(uri);
}
Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName);
return File(stream, mimeType);
}
我看了看周圍SO和互聯網,但我找不到解決方案。
- https://sharepoint.stackexchange.com/questions/186551/placing-a-sharepoint-openbinarystream-into-a-byte-array-csom
- OutOfMemoryException when I read 500MB FileStream
- OutOfMemoryException when send big file 500MB using FileStream ASPNET
我開始通過方法WebClient.DownloadData
讀取所有數據到byte[]
。當我得到OutOfMemoryException
時,我想用方法WebClient.OpenRead
代替Stream
,可以解決這個問題,但我仍然遇到大文件的例外。對於較小的文件,行爲就像我想要的那樣。我如何解決這個異常?
UPDATE
上面的示例代碼不是真正的代碼。真正的代碼有一個較低級別的客戶端類檢索流,並將其傳遞給調用堆棧,最終傳遞給控制器。儘管如此,客戶類確實使用了using
語句。如果該方法返回時流關閉,並且代碼退出using
塊,那麼爲什麼它適用於較小的文件?此外,我實際上通過手動處理流並使用緩衝區寫入響應來獲得我的代碼。我當前的代碼正在關閉finally
塊中的流(在控制器操作方法中 - 仍然從較低級別的客戶端類中檢索流)。 (注意:我回來後我的新代碼作爲答案,並關閉了這個問題,但現在我有點糊塗了。)
您是否嘗試過? https://stackoverflow.com/questions/41961496/how-do-i-increase-maximum-download-size-in-an-mvc-application – ArhiChief