我想从HttpHandler流式传输大型文件。它似乎不工作,因为它没有流式传输文件。相反,它将文件读入内存,然后将其发送回客户端。我期待所有的解决方案,并且解决方案告诉我,他们在做同样的事情时会传输文件。我的解决方案,流是这样的:流式传输大型视频文件.net
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'](http://msdn.microsoft.com/en-us/library/system.web.ihttpasynchandler.aspx)异步实现此操作,并异步读取磁盘。 – vcsjones
@ vcsjones-我不确定Async是如何工作的,但只是做了一个快速谷歌,我不知道如何解决这个问题。这似乎释放了一个线程返回到客户端异步从磁盘读取,但会返回内容,因为它仍然从磁盘读取? – Jake