地址:http://code.google.com/p/talifun-web/,唯一更改的一段代码在Httpmodule下的TransmitEntityStrategyForIIS.cs类里,更改了Transmit方法。因为是用机顶盒访问该web网站下的视频资源,通过http地址访问,怀疑机顶盒的缓冲池比较小,按照原来的transmit方法,一次性把所以的视频资源都写入response里,会导致连接直接关闭,机顶盒无法播放视频。更改后的transmit方法一次写入1M,在写入6次也就是6M以后,连接也被关闭,但是起码机顶盒可以开始播放了。

另外,机顶盒发出的HttpRequestHeader内容与从IE发出的不一样:

1)机顶盒的connection为close,不是keep-active,所以访问结束会关闭连接;

2)机顶盒支持断点续传,request里包含了range内容,即从视频资源的某中间位置开始下载。在这个例子里,机顶盒一连发出4个request,请求的位置分别是0byte, 48byte,92byte,和倒数约1.5M。而且其中每个request都以HttpException结束,不知是否是连接被断开的缘故。

在debug时,response.IsClientConnected方法起到了大作用。

public void Transmit(HttpResponseBase response)
{
    WriteLog("TransmitEntityStrategyForIIS.Transmit();");
    int length;
    long dataToRead;
    byte[] buffer = new byte[10000];
    //response.Clear();
    using (Stream s = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        dataToRead = s.Length;
        while (dataToRead > 0)
        {
            WriteLog("dataToRead:" + dataToRead);
            if (response.IsClientConnected)
            {
                length = s.Read(buffer, 0, 10000);
                response.OutputStream.Write(buffer, 0, length);
                response.Flush();
                buffer = new byte[10000];
                dataToRead = dataToRead - length;
                        
            }
            else
            {
                dataToRead = -1;
            }
        }
        WriteLog("IsClientConnected end:" + response.IsClientConnected);
        if (s != null)
        {
            s.Close();
        }
    }
}

posted on 2011-09-22 12:07  linpiner  阅读(859)  评论(0)    收藏  举报