我正在尝试在WebForms中从HttpHandler流式传输大文件。它似乎不起作用,因为它没有流式传输文件。相反,它会将文件读入内存,然后将其发送回客户端。我寻找解决方案,并且这些解决方案告诉我他们在执行相同的操作时流式传输文件。我的解决方案是:
using (Stream fileStream = File.OpenRead(path))
{
context.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(360.0));
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.AppendHeader("Content-Type", "video/mp4");
context.Response.AppendHeader("content-length", file.Length);
byte[] buffer = new byte[1024];
while (true)
{
if (context.Response.IsClientConnected)
{
int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
if (bytesRead == 0) break;
context.Response.OutputStream.Write(buffer, 0, bytesRead);
context.Response.Flush();
}
else
{
break;
}
}
context.Response.End();
}
发生的情况是,如果我调试代码,对于小文件,它将播放视频,但直到达到context.Respond.End()行才播放。但对于大文件,这种方法将无效,因为它会将整个文件存储在内存中,这会带来问题。
IHttpAsyncHandler
异步实现所有操作,并且异步从磁盘中读取数据。 - vcsjones