智能客户端SmartClient (二)
.net平台WinForms应用程序举例
一、系统需求
1、客户端软件要求
任何支持 .NET Framework 的操作系统
已安装 SP1 的 .NET Framework
Internet Explorer 5.0.1 或更高版本
2、服务器软件要求
自动发布、更新服务器:Microsoft .NET Framework、MDAC2.7、IIS
二、运行方式
客户端应用程序有两种运行方式,不同的运行方式将直接影响以后的程序集发布和更新,以下将详细解释:
1、网络运行
.NET Framework 安装提供了一个挂接 Internet Explorer 5.01 和更高版本以侦听所请求的 .NET 程序集的机制。在请求期间,可执行程序被下载到磁盘上称为程序集下载缓存的位置(Windows2000下为:C:\Documents and Settings\Administrator \Local Settings\Application Data\assembly下的某个子目录中),同时该程序集本身以及它引用的其他相关程序集也被下载到本地IE缓存中(Windows2000下为:C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files)。然后,名为 IEExec 的进程在具有有限安全设置的环境中启动该应用程序。例如:您可以在IE的地址栏中输入一个已发布在web服务器上的.net可执行程序(http://SmartClient/MyApplication.Exe),IE并不会像其他文件一样提示您另存为,而是直接执行该程序。
通过这种方式运行的应用程序拥有非常有限的安全设置(Internet权限集),该权限集中的权限包括:安全性、文件对话框、正在打印、独立存储文件、用户界面。独立存储文件允许您的应用程序保存一些数据(Windows2000下为:C:\Documents and Settings\Administrator.TOMATO\Local Settings\Application Data\IsolatedStorage下的某个子目录中,默认存储空间大小为10MB),您可以通过System.IO.IsolatedStorage命名空间中的类来保存数据而不会抛出安全异常。
举例:
//按用户、域、程序集获取独立存储区
IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User
| IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null);
//创建目录
isoStore.CreateDirectory("TestDir");
//创建文件
IsolatedStorageFileStream isoStream1 = new IsolatedStorageFileStream
("TestDir//test.txt", FileMode.Create, isoStore);
//写入文件
StreamWriter writer = null;
writer = new StreamWriter(isoStream1);
writer.WriteLine("Hello Isolated Storage");
writer.Close();
isoStream1.Close();
为了让你的智能应用程序运转,你需要改变一些客户端的安全设置,实质上就是通知客户端运行时间相信你的应用程序。一种方法就是将带有你的程序集的站点添加到IE中可信任站点清单中,然后用安装在你的管理工具目录下的Microsoft .NET Framework Configuration工具来修改.NET Framework安全设置。
打开Framework Configuration工具,选择运行库安全策略,然后选择调整安全区域。对于受信任站点中指定的所有站点,将信任级别调整到完全信任。作为选择,你也可以用Framework Configuaration工具来修改安全策略,使它信任你的应用程序的个别程序集。右击运行库安全策略,选择提高程序集的信任级别。
另一个可选择的方法就是用代码组,用Framework Configuration工具来帮助你提高应用系统的程序集的安全设置。你需要让所有运用你的应用程序的桌面用户做这种改变。为了帮助完成该任务,Framework Configuration工具可以创建一个包含安全策略的Microsoft Installer (MSI)部署包。MSI安装了应用程序加载器来分布你的应用程序需要的安全策略和加载器装配。右击运行库安全策略,选择创建部署包。
在网络运行中,自动更新是依靠IE的缓存机制来完成的。即当您需要下载并运行一个应用程序时,IE将向Web服务器发送一个HTTP请求,该请求将获取服务器上该程序的最新更新日期,如果该日期大于本地缓存的程序的日期或者本地缓存中不存在该程序,则从服务器上下载,否则直接使用本地缓存的程序。因此对于.net本身所具有的版本机制而言,不能作为版本更新的依据,只有在某个程序集文件引用另外一个程序集时,才会由.net运行时依据自身的版本机制判断版本号。
注意事项:
· 这种运行方式通常需要在运行前先设置用户的安全策略。
· 加载应用组件时,需要一个完整的url地址。
· 如果应用程序集中需要调用Web Service,该Web Service所在的服务器地址只能是最初下载程序集的服务器,可以构造一个重定向来解决该问题。
· 某些文件可能不能通过自动更新机制来完成版本更新,如:.Config应用程序的配置文件。
· 如果某些应用程序集文件的版本之间存在着某些关联性,则在某些情况下(如:网络突然中断)可能会出现不能正确加载并导致客户端应用程序出错的问题。
· 如果用户清空IE的缓存,则客户端应用程序将不能离线工作。
2、本地运行
顾名思义,这种运行方式客户端应用程序和其他应用组件并不在IE缓存和.net下载缓存中运行,需要用户首先下载客户端程序集并保存到一个本地目录下,然后运行。这样客户端应用程序以及其他应用组件就拥有了所有的本地安全权限。
虽然不涉及安全性问题,但应用组件以及程序的自动更新如何实现?这就需要一个单独的组件来完成这些任务。通过该链接地址可以下载一个非常完善且支持扩展的自动更新组件(http://www.gotdotnet.com/team/windowsforms/DotNetUpdater.zip),该打包文件中提供了源码、一些例子以及文档。该更新组件使用HTTP-DAV技术来完成文件在服务器和客户端之间的传输,因此对Web服务器有一定的限制,IIS5.0和新版本的Apache支持该功能。具体使用方式请参见内含文档。
注意事项:
· 由于需要自己来实现更新和下载功能,所以会增加一定的工作量。(就是使用第三方的更新组件,也需要对其进行完善以满足自己的要求)
· 基本解决了网络运行的缺点,但需要每次更新时重新下载所有的文件(如果采用增量更新的话,某些情况下会出现某个版本的文件被遗漏的问题),会增加网络流量。
· 应该在后台线程中执行更新和下载,不影响用户的正常操作。