字符串返回 asp.net 的 HTTP 处理程序

Posted

技术标签:

【中文标题】字符串返回 asp.net 的 HTTP 处理程序【英文标题】:HTTP Hanlder for string return asp.net 【发布时间】:2014-02-17 10:24:36 【问题描述】:

我正在使用 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 标记中使用了相同的方法:(target="http://localhost:54091/handler1.ashx?channelid=22") 但链接无法播放。我使用断点来验证处理程序是否正常工作并返回字符串,但 vlc 不播放流。

【问题讨论】:

【参考方案1】:

我尝试了 302 重定向,但 VLC 也没有反应。问题是 vlc 需要 rtmp 或 rtmpt 协议,而您正试图将其重定向到 http 层 - 这不起作用。您必须在 rmpt 级别进行重定向或创建 rmpt 代理而不是 http 处理程序。如果您打算这样做,请查看http://www.fluorinefx.com/download.html - 看起来对于这项工作来说是很棒的 .NET API。

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

【讨论】:

这对我不起作用@Ondrej Svejdar。请帮忙,我很担心很累,但我需要解决它。谢谢。 我按照您输入的内容进行操作,但仍然不走运。等待您的回复。 再次感谢@Ondrej,我只有 rtmp 链接,无法控制 rtmp 服务器。【参考方案2】:

问题是您的处理程序返回的是流的 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;

这会在页面加载时自动将提要的链接插入到目标属性中。

【讨论】:

感谢您的回复@Anduril,但是当您通过萤火虫或其他东西检查源代码时,它会暴露链接。如何对查看者隐藏链接? @Kahid 我能想到的唯一其他选择(我强烈不推荐)是使用处理程序,但不是传递 URL,而是需要从目标 URL 中提取提要并将流写入响应 - 实际上充当代理;这样只会公开处理程序 URL。但是,此选项更复杂,并且会真的严重扩展,因为它需要同时提取提要并将其发送回客户端,从而迅速使您的服务器连接饱和.隐藏网址很重要吗? 是的,有必要根据客户要求隐藏电视频道链接。任何玩家中的任何人都可以使用它。 在这种情况下,唯一的其他可能性是某种 URL 重写。您可以使用自定义 HTTP 模块并按照 This tutorial 重写请求

以上是关于字符串返回 asp.net 的 HTTP 处理程序的主要内容,如果未能解决你的问题,请参考以下文章

支持 JSONP 的 ASP.NET 通用 HTTP 处理程序 (.ashx)

如何从 asp.net 处理程序返回 404 错误?

ASP.Net Core 2 错误处理:如何在 Http Response 中返回格式化的异常详细信息?

如何使用ASP.Net发送HTTP请求并且获取返回的XML

asp.net 发送http get请求,然后取返回来的文件或者字符串

Asp.net http 处理程序文本文件下载问题。适用于代码隐藏