字符串返回 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 Core 2 错误处理:如何在 Http Response 中返回格式化的异常详细信息?