创建Silverlight 5浏览器内受信应用

创建Silverlight 5浏览器内受信应用,第1张

概述在Silverlight 4中受信应用已经被支持,受信应用简单的说就是可以访问一些本地受限资源的Silverlight应用。在Silverlight 4中受信应用必须是OOB类型,即必须先安装在本地,同时受信应用能访问的资源也有限,例如只能访问我的文档、我的图片等位置的文件。而在Silverlight 5中受信应用的功能做了很大的改进和增强: 受信应用可以运行于浏览器之内 可以无限制的访问本地文件

在Silverlight 4中受信应用已经被支持,受信应用简单的说就是可以访问一些本地受限资源的Silverlight应用。在Silverlight 4中受信应用必须是OOB类型,即必须先安装在本地,同时受信应用能访问的资源也有限,例如只能访问我的文档、我的图片等位置的文件。而在Silverlight 5中受信应用的功能做了很大的改进和增强:

受信应用可以运行于浏览器之内

可以无限制的访问本地文件系统

访问强安全性方法时,不会再引发MethodAccessException异常

当运行于桌面模式时,可以创建多个窗口

在windows平台可以直接调用非托管函数

可以看到,在Silverlight 5中受信应用的权限几乎获得了与桌面应用相当的权限,在这里,我将为大家介绍如何创建浏览器内的受信应用。以下示例将通过Silverlight来监视本地的网络流量。

受信应用的创建与常规Silverlight应用没有差异,直接通过新建项目来创建:

要使应用受信任,必须修改项目的属性,必须勾选“允许在浏览器外允许程序”,以及“在浏览器内运行时需要提升的权限”:

单击浏览器外设置按钮,进入以下设置界面,勾选“在浏览器之外运行时需要提升的信任”,由于我们的应用只允许在浏览器内运行,所以可将“显示安装菜单”的复选框去掉。这里说明一下,由于受信应用在Silverlight之前版本是和浏览器外运行绑定的,所以这里我们可以看到,虽然现在不使用浏览器外运行方式,但也需要对OOB进行设置,以此来获取受信模式。

实现功能。我们将调用非托管的Win32 API来实现本地网络流量的监视,在Silverlight 5中,调用本地非托管函数的方式与.NET下完全一致。具体请参照本文源码,代码片段:

  public static class WIN32API          {              [Dllimport("kernel32.dll")]              public static extern bool GetComputername(StringBuilder computername, out Int32 nameLength);                   [Dllimport("IphlpAPI.dll")]              private static extern Int32 GetIftable(Byte[] pIftable, out long pDWSize, bool border);                   [Dllimport("kernel32.dll")]              private static extern  int MultiBytetoWIDeChar(uint codepage,Int32 DWFlags,byte[] lpMultiByteStr,Int32 cbMultiByte,byte[] lpWIDeCharStr, int cchWIDeChar);                   public static MIB_IFtable GetIftable()              {                  MIB_IFtable table = new MIB_IFtable();                  long size = 0;                  GetIftable(nullout size, false);                  if (size != 0)                  {                      Byte[] data = new Byte[size];                      long ret = GetIftable(data, false);                      if (ret == 0)                      {                          MemoryStream ms = new MemoryStream(data);                          ms.position = 0;                          BinaryReader br = new BinaryReader(ms, EnCoding.Unicode);                               table.DWNumEntrIEs = br.ReadInt32();                          table.table = new MIB_IFROW[table.DWNumEntrIEs];                          for (int i = 0; i < table.DWNumEntrIEs; i++)                          {                              table.table[i] = new MIB_IFROW();                              MIB_IFROW curRow = table.table[i];                              FIEldInfo[] fis = typeof(MIB_IFROW).GetFIElds();                              foreach (FIEldInfo fi in fis)                              {                                  if (!fi.Isstatic)                                  {                                      MarshalAsAttribute[] attrs = fi.GetCustomAttributes(typeof(MarshalAsAttribute), trueas MarshalAsAttribute[];                                      if (attrs != null && attrs.Length > 0 && attrs[0].SizeConst != 0)                                      {                                               if (fi.FIEldType == typeof(String))                                          {                                              Byte[] tmpChars = br.ReadBytes(attrs[0].SizeConst*2);                                              fi.SetValue(curRow, EnCoding.Unicode.GetString(tmpChars, 0, tmpChars.Length).TrimEnd('));  '                                    }                                              else if (fi.FIEldType == typeof(Byte[]))                                      {                                              fi.SetValue(curRow, br.ReadBytes(attrs[0].SizeConst));                                          }                                      }                                          else                                 {                                              if (fi.FIEldType == typeof(Int32))                                      {                                              Int32 tmpValue = br.ReadInt32();                                              fi.SetValue(curRow, tmpValue);                                          }                                      }                                       }                              }                          }                      }                  }                           return table;          }                       public static String AsciiToUTF8(Byte[] asciiBytes)          {                      int mustBytes = MultiBytetoWIDeChar(win32conST.CP_ACP, win32conST.MB_PrecomposeD, asciiBytes, -1, null, 0);                  if (mustBytes > 0)              {                      Byte[] tmpBytes =     new Byte[mustBytes*2];                      if (MultiBytetoWIDeChar(win32conST.CP_ACP, tmpBytes, mustBytes) != 0)                  {                             return EnCoding.Unicode.GetString(tmpBytes, tmpBytes.Length);                  }                  }                      return "";          }          }       


 

测试,当在本地测试时,即访问地址为localhost或127.0.0.1时,受信应用无需做任何设置即可运行,本示例运行结果如下:

接下来我们将说明如何部署受信应用,首先,要使受信应用在远程客户机上被访问,必须对xap进行签名。 进入TrustedApp项目属性,转到签名页,勾选“为Xap文件签名”,这里我们将创建一个新的测试证书,以此进行演示,实际项目中可以向证书颁发机构申请信任证书,当然这是需要$的。单击创建新测试证书按钮,在d出对话框中输入密码,这里设置为test,确定后,Visual Studio将创建一个证书文件,默认保存在项目根目录下。

接下来单击“从存储区选择”按钮,在d出窗口中选择刚才创建的证书

在签名页面,单击“更多详细信息”按钮,将会显示证书的详细信息,选择详细信息标签,然后单击“复制到文件”按钮,进入证书导出向导:

  进入以下页面后,选择不要导出私钥:

  此步骤导出的证书供客户端使用! 完成后重新生成解决方案 将受信应用部署到IIS,部署与传统ASP.NET应用一样,无需做其他设置。 以上基本完成了服务端的设置,接下来对于客户端需要做一些设置,才能在浏览器内运行受信应用 首先需要启用浏览器内受信应用权限,这可直接通过修改注册表来完成:
注册表路径:HKEY_LOCAL_MACHINE\Software\Microsoft\Silverlight\
值名称:AllowElevatedTrustAppsInbrowser
值类型:DWORD
可用值:不可在浏览器内运行受信应用,设置为0,如果启用设置为1 在客户端安装第9步骤导出的证书,在证书文件上单击右键,选择安装,进入证书安装向导,选择存储区时,将证书导入到“受信任的发布者”位置:

重复第14步骤,选择存储区时,将证书导入到“受信任的根证书颁发机构”位置。 到此,我们即可在此客户端上运行受信应用了(注意下图中的地址已经是非本机地址):

但是,必须注意此时的Silverlight是没办法自动更新的,也就是说服务端xap更新后,客户端重新访问时不会去自动下载xap,这显然不符合需求,那该怎么做呢?我们需要在每次生成xap的时候,自动对xap进行时间戳签名。 进入到TrustedApp项目属性,选择生成事件:


在后期生成事件命令行中输入以下命令,进行xap的时间戳签名:
"C:\Program files\Microsoft SDKs\windows\v6.0A\bin\signtool.exe" sign /v /f "$(ProjectDir)TrustedApp_1_TemporaryKey.pfx" /p test /t http://timestamp.comodoca.com/authenticode $(Targetname).xap
前面为signtool的全路径,它通常位于所安装的windows SDK目录下, /f 后面跟随证书的全路径,以上示例表示当前项目下的TrustedApp_1_TemporaryKey.pfx证书文件,/p 后面表示证书的密码,/t 后面跟随一个CA Authenticode TimestamPing Service的URL地址,命令最后部分为需要签名的xap文件。
进行此步 *** 作后,每次生成xap文件后,Visual Studio将自动调用次命令进行xap的时间戳签名。这样,客户端重新访问网页时,即可自动下载更新xap。

转自:http://developer.51cto.com/art/201203/321824.htm

总结

以上是内存溢出为你收集整理的创建Silverlight 5浏览器内受信应用全部内容,希望文章能够帮你解决创建Silverlight 5浏览器内受信应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1065025.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存