我在C#Asp.Net中创建了一个类,它充当IHttpHandler
来处理一些特殊请求,以便从MS SQL Server 2008数据库中检索以流的形式获取视频。
从前端我使用VLC播放器的网络插件使用嵌入式标签请求这些视频流,如下所示:
<embed type="application/x-vlc-plugin" pluginspage="http://www.videolan.org"
width="840" height="472" name="vlcPlayerExtraFeatures"
id="vlcPlayerExtraFeatures" target="http://my-pc/MyWebApp/file.ivd?VideoID=123"
autoplay="true" windowless="true" bgcolor="#000000" />
<object classid="clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921"
codebase="http://download.videolan.org/pub/videolan/vlc/last/win32/axvlc.cab">
</object>
在 ProcessRequest(HttpContext context)方法的IHttpHandler类中,首先我从“context”参数中检查用户的Asp.Net Session,如下所示:
if (context.Session["LoggedinUser"] == null) {
//do bla bla bla
}
问题是:使用VLC播放器网络插件,context.Session["LoggedinUser"]
始终为null
。
如果我使用Windows媒体播放器web插件请求相同的文件,我会得到提及的会话信息,但不会提到VLC。
如果这与VLC媒体播放器存在某种问题?
答案 0 :(得分:0)
根据我的发现,使用VLC Web插件,您无法访问服务器上的Asp.Net会话。 我做了另一个解决方法。在持有VLC嵌入标签的页面后面的代码中。在页面加载时,VLC嵌入标记的URL参数值以以下形式附加旁路标记:
<OBJECT id="vlc" width="840" height="472"
CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-oleobject">
<PARAM NAME="URL" VALUE="http://mysite.com/video.ivd?videoId=myvideo1234&videoToken=some_token_with_expiry_date" />
<PARAM NAME="SendPlayStateChangeEvents" VALUE="True" />
<PARAM NAME="AutoStart" VALUE="True" />
<PARAM NAME="ShowControls" value="True" />
</OBJECT>
注意:此Url中的查询字符串部分在此处未加密显示,但在实际页面上它是加密的(在page_load方法中实际完成)。
当VLC从我的自定义IHttp处理程序请求视频时,查询字符串部分在处理程序中被解密,并且令牌的有效性将根据提供的视频令牌的到期日期进行评估。如果它仍然有效,则视频将流式传输到客户端,否则请求将被拒绝,因此客户端可能无法无限期地使用此URL。
这是一个适用于我的案例的解决方法。可能是其他人有比这更好的方法。