【发布时间】:2013-05-27 14:23:16
【问题描述】:
我正在尝试从 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- 我不确定异步是如何工作的,但只是快速谷歌了一下,我不明白这将如何解决问题。这似乎释放了一个线程以返回客户端以从磁盘异步读取,但由于它仍在从磁盘读取内容,这会返回内容吗?
-
这个问题救了我,谢谢!
标签: c# asp.net video-streaming webforms ihttphandler