在ASP.NET应用程序中,我正在使用下面显示的代码从共享路径读取视频文件并在浏览器中播放它们。它适用于小于300 mb的文件,但是它会抛出650 mb文件的内存不足异常,而大于2 gb则会抛出
文件太长。目前,此操作仅限于支持小于2 GB的文件。
我的代码:
ImpersonationHelper.Impersonate(ConfigurationManager.AppSettings["Domain"], ConfigurationManager.AppSettings["UserName"],ConfigurationManager.AppSettings["Password"], delegate
{
FileBuffer = System.IO.File.ReadAllBytes(filepath);
if (FileBuffer != null)
{
Response.Buffer = true;
Response.ContentType = contenttype;
Response.AddHeader("Content-Disposition", "inline");
Response.AddHeader("content-length", FileBuffer.Length.ToString());
Response.BinaryWrite(FileBuffer);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
Response.Close();
Response.End();
}
});
答案 0 :(得分:1)
将整个文件加载到内存中不是一个好主意。您可以执行以下操作来代替使用FileBuffer
数组:
// ...
using (var stream = new FileStream(filepath, FileMode.Open, FileAccess.Read))
{
Response.AddHeader("content-length", stream.Length.ToString());
stream.CopyTo(Response.OutputStream);
}
您还应该删除此行Response.Buffer = true;
,并在开头添加Response.BufferOutput = false;
。使用BufferOutput == true
,Web服务器会将整个输出保存到内存中,只有在将其发送到客户端之后才保存。我们不希望这种情况发生。