C# Response.OutputStream.Flush()-未响应

C# Response.OutputStream.Flush()-未响应,c#,video-streaming,C#,Video Streaming,我正在使用handler(ashx)文件传输视频 获取视频文件流并在while循环中使用outputstream写入字节, 但只有在while循环完成之前,接收的字节才为零 public class VideoHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { System.Net.WebRequest wreq; System.Net.HttpWe

我正在使用handler(ashx)文件传输视频

获取视频文件流并在while循环中使用outputstream写入字节, 但只有在while循环完成之前,接收的字节才为零

public class VideoHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {

        System.Net.WebRequest wreq;
        System.Net.HttpWebResponse wresp;
        try
        {
            HttpRequest Request = context.Request;

            string OrginalUrl = GetURL();

            wreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(OrginalUrl);
            wreq.Timeout = 1000 * 60 * 60;
            wresp = (System.Net.HttpWebResponse)wreq.GetResponse();


            using (Stream mystream = wresp.GetResponseStream())
            {

                int length = Convert.ToInt32(wresp.ContentLength);

                context.Response.Clear();
                context.Response.Buffer = false;
                context.Response.BufferOutput = false;

                context.Response.AddHeader("Content-Type", "application/octet-stream");
                context.Response.AddHeader("Content-Length", length.ToString());

                byte[] buffer = new byte[512];

                if (context.Response.IsClientConnected)
                {
                    while (mystream.CanRead)
                    {
                        int bytesRead = mystream.Read(buffer, 0, buffer.Length);
                        if (bytesRead == 0) break;

                        context.Response.OutputStream.Write(buffer, 0, bytesRead);
                        context.Response.OutputStream.Flush();
                        context.Response.OutputStream.Close();
                    }
                }


                String DateValue = DateTime.Now.ToString();

                mystream.Close();
            }

        }
        catch (Exception e)
        {
        }
        finally
        {
            wresp = null;
            wreq = null;
        }
    }
}
这是我的处理程序文件,我缺少什么

这是我的HTML

<video id="videoPlayer1" class="video-js vjs-default-skin" preload="metadata" controls="controls" width="700" height="500"
                    data-height="500" autoplay="autoplay" >
                    <source id="source1" src="Handlers/VideoHandler.ashx" type="video/mp4" />
                </video>

谢谢使用

context.Response.Flush();
直接的。并且不要关闭输出流

总之,当缓冲关闭时,您根本不需要冲洗


你也应该设置适当的内容类型——HTML5视频播放器往往对此相当挑剔<代码>应用程序/八位字节流可能无法将其切断


当然,您希望支持部分下载,这在提供长视频文件时非常方便:)

为什么在
的同时关闭
循环中的输出流?为什么要吞咽所有异常?只是尝试了这个“context.Response.OutputStream.Flush();”但是运气不好。@SumoS为什么不试试答案和注释所建议的内容呢?删除了这一行(context.Response.OutputStream.Close()),但没有更改。我在循环中添加了(context.Response.Flush()),但运气不好。你应该设置正确的内容编码-这是什么意思?@SumoS我指的是内容类型。例如,mp4视频的
video/mp4
。Luaan,谢谢你的快速响应,我尝试了,但没有成功。@SumoS哦,你为什么要从另一个HTTP请求发送数据?这有什么意义?为什么不直接重定向呢?这只是另一点,你正在失去“流”(并不是说你实际上正在做任何流)。另外,您是否尝试过使用开发人员工具或Wireshark来监控实际通信?你为什么认为
是罪魁祸首?