HTTP Hanlder for string return asp.net

时间:2014-02-17 10:24:37

标签: c# asp.net httphandler vlc rtmp

我正在使用vlc插件播放rtmp链接以进行直播。如果将流媒体链接放在目标标记中,就像在下面的代码中一样,它可以正常工作:

<embed 
type='application/x-vlc-plugin'
pluginspage='http://www.videolan.org'
version='VideoLAN.VLCPlugin.2'
width='800'
height='600'
id='vlc'
loop='yes'
autoplay='yes'
target="rtmp://122.221.75.124:1935/live/myc001">
</embed>

问题: 所以我的要求是通过显示html源代码来隐藏来自观众的rtmp链接。我使用Http Handler从数据库返回链接。 vlc插件Target标记为:

target="Handler1.ashx?ChannelID=22">

我的Hanlder1.ashx代码是:

 public class Handler1 : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        if (context.Request.QueryString["ChannelID"] == null) return;
        string connStr = Connection_Class.Str_Conn;
        string channelID = context.Request.QueryString["ChannelID"];
        if (channelID == "") { return; }

        using (SqlConnection conn = new SqlConnection(connStr))
        {
            using (SqlCommand cmd = new SqlCommand("SELECT Link FROm TblChannel WHERE ChannelID = @id", conn))
            {
                cmd.Parameters.Add(new SqlParameter("@id", channelID));
                conn.Open();
                using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    reader.Read();
                    if (reader.HasRows == true)
                    {
                        string lnk = "";
                        lnk = reader["Link"].ToString();
                        context.Response.Clear();
                        context.Response.Write(lnk);
                        reader.Close();
                        context.Response.End();
                    }
                    else
                    { return; }
                }
            }
        }

当我在浏览器中输入时,Hanlder1正确返回链接:

http://localhost:54091/handler1.ashx?channelid=22

我在vlc Target tage中使用了相同的方法:(target =“http:// localhost:54091 / handler1.ashx?channelid = 22”)但链接不起作用。我使用断点来验证处理程序是否正常工作并返回字符串,但vlc不播放流。

2 个答案:

答案 0 :(得分:0)

我尝试了302重定向,而VLC也没有做出任何反应。问题是vlc期待rtmp或rtmpt协议,你试图将它重定向到http层 - 这是行不通的。您必须在rmpt级别上进行重定向或创建rmpt代理而不是http处理程序。如果您正以这种方式看看http://www.fluorinefx.com/download.html - 对于这项工作来说似乎是非常棒的.NET API。

其他方式(我不知道你对rmpt服务器本身有多少控制权,这种方式假设你确实对它有一些控制权)是破解握手阶段 - 即你将直接生成到rmtp的链接作为链接的一部分,您将通过对称加密的令牌。 - 即。 rmpt:// whatver?在秘密部分中的token = secret将是时间戳和一些随机的rubish以使其安全; rmpt服务器将解码令牌并拒绝所有具有旧时间戳的请求 - 这样人们可以看到该链接,但在一段时间后它将变得无法使用。

答案 1 :(得分:0)

问题是你的处理程序正在返回流的url,而不是VLC期望的流本身。解决这个问题的最简单方法是使用处理程序并将目标指向它,而不是在获取页面时从asp设置目标属性:

<embed 
type='application/x-vlc-plugin'
pluginspage='http://www.videolan.org'
version='VideoLAN.VLCPlugin.2'
width='800'
height='600'
id='vlc'
loop='yes'
autoplay='yes'
target="<%= GetStreamLocation() %>" />

然后在页面后面的代码中有一个函数:

protected string GetStreamLocation()
{
    int channelId;
    var success = int.TryParse(Request.QueryString["ChannelID"], out channelId);
    if (!success) throw new Exception("Invalid channel id specified");
    string returnValue;

    using (SqlConnection conn = new SqlConnection(connStr))
    {
        using (SqlCommand cmd = new SqlCommand("SELECT Link FROM TblChannel WHERE ChannelID = @id", conn))
        {
            cmd.Parameters.Add(new SqlParameter("@id", channelID));
            conn.Open();
            using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                reader.Read();
                if (reader.HasRows == true)
                {
                    returnValue = reader["Link"].ToString();
                    reader.Close();
                }
            }
        }
    }
    if (string.IsNullOrEmpty(returnValue)) throw new Exception("Error loading link from database");
    return returnValue;
}

这将在页面加载时自动将Feed的链接插入目标属性。