ASP中实现对MediaPlayer控件播放文件地址隐藏的解决方案

网络整理 - 09-08

  在播放视频时,直接查看页面源文件可看到视频文件地址,MediaPlayer控件播放器将在页面上加上如下初始化语句:

  MediaPlayer控件初始化可查看到源文件地址

  Sys.Application.add_init(function()

  {

  $create(Sys.UI.Silverlight.MediaPlayer,

  {

  "autoPlay":true,"mediaSource":"",

  "scaleMode":2,"source":"UserControl/playerTheme/player.xaml","volume":1},

  null, null,

  $get("myUserMediaPlayer_player_parent"));

  });

  解决方案是先建立一个字符串加密解密服务

  加密、解密工具类

  1/**////

  2 /// 对字符串进行、加解密的工具类

  3 ///

  4 public class DESEncryptor

  5 {

  6 静态公共方法#region 静态公共方法

  7 /**////

  8 /// 对字符串进行加密

  9 ///

  10 ///源字符串

  11 /// 加密后的字符串

  12 public static string ExecEncrypt(string strSource)

  13 {

  14 DESEncryptor desEncryptor = new DESEncryptor() ;

  15 desEncryptor.InputString = strSource ;

  16 desEncryptor.DesEncrypt() ;

  17 return desEncryptor.OutString ;

  18 }

  19 /**////

  20 /// 对已经加密的字符串进行解密

  21 ///

  22 ///已经加密的字符串

  23 /// 还原后的字符串

  24 public static string ExecDeEncrypt(string strSource)

  25 {

  26 DESEncryptor desEncryptor = new DESEncryptor() ;

  27 desEncryptor.InputString = strSource ;

  28 desEncryptor.DesDecrypt() ;

  29 return desEncryptor.OutString ;

  30 }

  31 #endregion

  32

  33 私有成员#region 私有成员

  34 /**////

  35 /// 输入字符串

  36 ///

  37 private string inputString=null;

  38 /**////

  39 /// 输出字符串

  40 ///

  41 private string outString=null;

  42 /**////

  43 /// 输入文件路径

  44 ///

  45 private string inputFilePath=null;

  46 /**////

  47 /// 输出文件路径

  48 ///

  49 private string outFilePath=null;

  50 /**////

  51 /// 加密密钥

  52 ///

  53 private string encryptKey="fanmenglife";

  54 /**////

  55 /// 解密密钥

  56 ///

  57 private string decryptKey = "fanmenglife";

  58 /**////

  59 /// 提示信息

  60 ///

  61 private string noteMessage=null;

  62 #endregion

  63

  64 公共属性#region 公共属性

  65 /**////

  66 /// 输入字符串

  67 ///

  68 public string InputString

  69 {

  70 get{return inputString;}

  71 set{inputString=value;}

  72 }

  73 /**////

  74 /// 输出字符串

  75 ///

  76 public string OutString

  77 {

  78 get{return outString;}

  79 set{outString=value;}

  80 }

  81 /**////

  82 /// 输入文件路径

  83 ///

  84 public string InputFilePath

  85 {

  86 get{return inputFilePath;}

  87 set{inputFilePath=value;}

  88 }

  89 /**////

  90 /// 输出文件路径

  91 ///

  92 public string OutFilePath

  93 {

  94 get{return outFilePath;}

  95 set{outFilePath=value;}

  96 }

  97 /**////

  98 /// 加密密钥

  99 ///

  100 public string EncryptKey

  101 {

  102 get{return encryptKey;}

  103 set{encryptKey=value;}

  104 }

  105 /**////

  106 /// 解密密钥

  107 ///

  108 public string DecryptKey

  109 {

  110 get{return decryptKey;}

  111 set{decryptKey=value;}

  112 }

  113 /**////

  114 /// 错误信息

  115 ///

  116 public string NoteMessage

  117 {

  118 get{return noteMessage;}

  119 set{noteMessage=value;}

  120 }

  121 #endregion

  122

  123 构造函数#region 构造函数

  124 /**////

  125 /// 构造函数

  126 ///

  127 public DESEncryptor()

  128 {

  129 //

  130 // TODO: 在此处添加构造函数逻辑

  131 //

  132 }

  133 #endregion

  134

  135 DES加密字符串#region DES加密字符串

  136 /**////

  137 /// 加密字符串

  138 /// 注意:密钥必须为8位

  139 ///

  140 public void DesEncrypt()

  141 {

  142 byte[] byKey=null;

  143 byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};

  144 try

  145 {

  146 byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8));

  147 DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  148 byte[] inputByteArray = Encoding.UTF8.GetBytes(this.inputString);

  149 MemoryStream ms = new MemoryStream();

  150 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write) ;

  151 cs.Write(inputByteArray, 0, inputByteArray.Length);

  152 cs.FlushFinalBlock();

  153 this.outString=Convert.ToBase64String(ms.ToArray());

  154 }

  155 catch(System.Exception error)

  156 {

  157 this.noteMessage=error.Message;

  158 }

  159 }

  160 #endregion

  161

  162 DES解密字符串#region DES解密字符串

  163 /**////

  164 /// 解密字符串

  165 ///

  166 public void DesDecrypt()

  167 {

  168 byte[] byKey = null;

  169 byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};

  170 byte[] inputByteArray = new Byte[this.inputString.Length];

  171 try

  172 {

  173 byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8));

  174 DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  175 inputByteArray = Convert.FromBase64String(this.inputString);

  176 MemoryStream ms = new MemoryStream();

  177 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);

  178 cs.Write(inputByteArray, 0, inputByteArray.Length);

  179 cs.FlushFinalBlock();

  180 System.Text.Encoding encoding = new System.Text.UTF8Encoding();

  181 this.outString=encoding.GetString(ms.ToArray());

  182 }

  183 catch(System.Exception error)

  184 {

  185 this.noteMessage=error.Message;

  186 }

  187 }

  188 #endregion

  189}

  加密、解密WebService,调用工具内加密、解密方法:

  1/**////

  2 /// Summary description for Service1

  3 ///

  4 [WebService(Namespace = "")]

  5 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

  6 [System.ComponentModel.ToolboxItem(false)]

  7 // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.

  8 // [System.Web.Script.Services.ScriptService]

  9 public class Service1 : System.Web.Services.WebService

  10 {

  11 /**////

  12 /// 加密

  13 ///

  14 ///地址

  15 ///

  16 [WebMethod]

  17 public string Encrypt(string url)

  18 {

  19 return DESEncryptor.ExecEncrypt(url);

  20 }

  21

  22 /**////

  23 /// 解密

  24 ///

  25 ///地址

  26 ///

  27 [WebMethod]

  28 public string DeEncrypt(string url)

  29 {

  30 return DESEncryptor.ExecDeEncrypt(url);

  31 }

  32

  }

  在MediaPlayer控件播放页面加载时,先调用WebService内加密方法对播放地址进行加密,然后注册JavaScript脚本调用视频文件播放方法:

  播放页面加载

  protected void Page_Load(object sender, EventArgs e)

  {

  if (!IsPostBack)

  {

  //对播放地址进行加密

  string encryptUrl = local.Encrypt(playUrl);

  //注册脚本,调用javascript播放方法

  Page.ClientScript.RegisterStartupScript(this.GetType(), "", " setTimeout(\"onPlay('" + encryptUrl + "')\",1000)", true); }

  }

  JavaScript调用WebService通过微软提供的WebService.htc实现,ASP.NET中使用WebService.htc需要在HTML代码中添加如下代码:

  

注意:该div必需在forms之外

  Javascript代码:

  1 function getUrl(str) {

  2 //第一个参数是webservice的url,后面是名称

  3 serviceDiv.useService(":88/Service1.asmx?WSDL", "news");

  4 //设置一个回调函数,service返回结果的时候回调;第一个参数是回调函数的名称,后面的是webservice的参数

  5 intCallID = serviceDiv.news.callService(url_result, "DeEncrypt", str); //这里有两个参数..

  6 }

  7

  8 function url_result(result)//回调函数

  9 {

  10 var media_player = $find('myUserMediaPlayer_player');

  11 media_player.set_mediaSource(result.value);

  12 media_player.set_autoPlay(true);

  13 }

  14

  15 function onPlay(str) {

  16 getUrl(str);

  17 }

  有几点需说明:

  1. 为什么在Page_Load事件里注册脚本不直接调用Javascript内播放方法,因为页面需完全加载后,WebService.htc才会被初始化,所以我用setTimeout方法延迟一段时间再调用播放方法。

  2. 大家在使用WebService回调函数时记得判断返回结果是否成功。

  通过以上方法,在页面上查看源文件便无法查看到播放文件地址了,MediaPlayer初始化语句更新为如下:

  更改后MediaPlayer控件初始化

  Sys.Application.add_init(function()

  {

  $create(Sys.UI.Silverlight.MediaPlayer,

  {"autoPlay":true,"scaleMode":1,"source":"../UserControl/playerTheme/VIPPlayer.xaml","volume":1},

  null, null, $get("ump_player_parent"));

  });

  不过这只是争对一般用户,如果大家有更好的方法可以拿出来一起共享,希望我的文章对大家有帮助