地址: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();
}
}
}
浙公网安备 33010602011771号