在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