您的位置:首页 > 其它

智能客户端技术总结(一)

2004-10-22 14:25 288 查看
                                                 智能客户端应用模型
1.定义:
一个可扩展的能集成不同应用的桌面应用程序,并具有以下特征:

¨         无接触部署:安装时只要将一个主程序文件下载到本地,直接运行即可,无须改变注册表或共享的系统组件,其他应用组件将在第一次运行时自动下载。

¨         自动更新:只需将新版本的程序发布在服务器上,由客户端自动发现最新版本的程序和应用组件,并自动下载和更新。

¨         离线运用:允许脱离服务器时,利用本地的客户端程序和应用组件进行工作。

¨         动态加载应用组件:应用软件开发商可根据企业应用系统的公共接口进行开发,然后将应用组件发布在企业的服务器上,客户端应用程序将自动发现并加载该应用组件。

¨         个性化用户界面:用户可根据喜好自行设置客户端应用程序,配置信息将被保存到服务器上。
2.DotNet平台举例
(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命名空间中的类来保存数据而不会抛出安全异常。

为了让你的智能应用程序运转,你需要改变一些客户端的安全设置,实质上就是通知客户端运行时间相信你的应用程序。一种方法就是将带有你的程序集的站点添加到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应用程序的配置文件
      如果某些应用程序集文件的版本之间存在着某些关联性,则在某些情况下(如:网络突然中断)可能会出

(2)创建程序
客户端应用程序的执行步骤:
1)    登录系统。通过输入用户名和密码或其他任何方式进行系统登录,通常需要一个登录窗体。(该步操作需要客户端应用程序在线执行,因此可以考虑在窗体上提供一个离线工作的按钮,然后直接使用上次在线登录时服务器传递的配置文件副本。这样做会引发一些安全性问题和客户端数据和服务器数据同步的问题。)

2)    由应用服务器验证通过以后,根据系统设定的用户权限获取用户可以加载的应用组件及其相应的配置信息,同时从数据库中获取用户的个性化配置信息,将这些配置信息组合成一个XML配置文件流传递给客户端应用程序。该步操作通常由一个Web服务调用来执行。

3)    客户端程序解析该配置文件流,根据个性化配置信息设置主窗体样式,根据应用组件配置信息加载相应的程序集文件。保存该配置文件以备离线工作时使用。

4)    (本地运行方式)启动后台更新线程,该线程定时搜索更新服务器上是否有最新版本的程序,如果有则自动下载,并提示用户更新程序。

5)    用户通过点击相应的应用组件的按钮或菜单,在客户端主窗体中将显示应用组件自身携带的用户界面。

       客户端应用程序基本包含了登录窗体、主窗体和应用组件加载器。加载器内有一个应用组件集合类,同时还提供一些方法用于主程序和应用组件之间以及不同应用组件之间的通讯,某些应用组件是作为公共组件为其他应用提供数据,因此应该通过统一的方法来获取数据。

注意事项和建议:
1)对于网络运行方式,程序集在动态加载的过程从服务器被下载到本地缓存中,而本地运行方式的下载过程由更新组件执行,加载过程则客户端主窗体执行。

在.net中动态加载程序集的方法:

       using System.Reflection;

       //网络运行方式,加载的程序集路径为服务器上的url地址

assemblyFileName = "http://SmartClient/AppComponent1.dll";

       //本地运行方式,加载的程序集路径为本地的目录路径

       assemblyFileName = @"c:/SmartClient/AppComponent1.dll";

       Assembly asm = Assembly.LoadFrom(assemblyFileName);

2)客户端应用程序的主窗体作为应用组件的容器,可以通过两种方法来显示应用组件的用户界面:

第一种方式是将客户端应用程序设计为多文档界面(MDI)应用程序,每个应用组件都包含有各自的启动主窗体,客户端应用程序执行每个应用组件时,将构造并显示该组件的启动窗体类型。MDI 应用程序中常有包含子菜单的“窗口”菜单项,用于在主窗口或应用之间进行切换。

另一种方式是在客户端应用程序的主窗体界面中预留一块应用界面区域,而每个应用组件作为一个用户控件在执行时被添加到应用界面区域的控件数组中。应用界面区域通常是一个面板(Pane)控件,通过更改用户控件的Z顺序在各个应用之间进行切换(Control. BringToFront())。

3)在客户端应用程序根据配置信息加载相应的应用组件时,同时需要在客户端主窗体的工具栏或菜单上创建对应的按钮和菜单项,并添加事件以便于用户操作。客户端应用程序和应用组件之间应尽量保持独立性,减少关联,以体现客户端应用程序结构清晰和简单。可以通过.net中的回调(事件委托)等方法实现这一点。

       使用此方法时需要注意,如果您构造的类型实例包含一个带参数的构造函数,则这些参数对象必须是可跨应用程序域访问的对象,即是可序列化的对象。可以通过继承MarshalByRefObject对象或使用[Serializable]特性标记类,同时设置远程对象的生存期策略。

 

(3)发布程序
1)在发布和更新服务器上设置一个虚拟目录(如:SmartClient)将应用组件的所有文件放置在相应的目录下。

       虚拟目录的设置属性中必须包括:读取和目录浏览权限,执行许可为纯脚本。

对于本地运行方式,需要根据客户端应用程序的版本号设置多个目录,每个目录存放不同版本的所有文件。(也可以在新版本目录下只存放更新了的文件,但需要修改更新组件。当用户更新版本时,必须下载大于当前版本的所有新版本目录下的文件,以防止某些情况下会出现某个版本的文件被遗漏的问题)。

       在本地运行方式中,还需要在根目录下维护一个更新版本清单文件,因为它允许用户以老版本客户端应用程序登录。

2)发布一个Web Service。该Web服务主要完成以下任务:

¨         执行客户端用户的身份验证

¨         从整个应用系统的安全模块中获取该用户允许执行的应用组件的清单,包含应用组件的位置、文件名称和应用组件本身所需的配置信息。(在本地运行方式下,该清单还和版本有关)

¨         从数据库中获取该用户的个性化配置信息,和上一步获取的信息合并为一个XML文件流。

¨         将该配置文件流作为返回参数返回给客户端应用程序。

3)将客户端应用程序放置在虚拟根目录下作为应用组件程序集的加载器,同时在企业内部网站上增加一个指向客户端应用程序的链接。对于网络运行方式,还将提供一个安全策略部署包(MSI)文件的链接。

       用户第一次运行时的执行步骤

       网络运行方式:

¨         下载并安装安全策略部署包

¨         通过点击客户端应用程序的链接,下载并执行客户端应用程序

¨         将该链接添加到收藏夹中或建立桌面快捷方式,以便于运行

本地运行方式:

¨         不直接点击客户端应用程序的链接,将此链接另存到用户选择的目录下

¨         在资源管理器中执行客户端应用程序

¨         在桌面上建立可执行文件的快捷方式,以便于运行

(4)更新程序
       网络运行方式的更新步骤较为简单,只须将更新了的文件直接覆盖老文件即可。其缺点是某些程序集附带的引用文件不能自动下载新版本,只有清空客户端的IE缓存后才能实现更新。

       本地运行方式的更新步骤如下:

¨         在服务器虚拟根目录下新建一个以新版本号命名的目录,增量更新只需将更新了的文件复制到该目录下,否则需要将所有文件都复制到目录。

¨         修改保存所有版本清单的文件,并指明当前活动的最新版本号,用于和客户端进行版本比较。

(5)扩展应用组件
       为了实现企业应用系统的可扩展性,通过接口定义,可以使应用开发商通过实现这些接口将自己的应用组件方便的添加到客户端应用程序中。以下介绍一些接口中主要包含的方法和属性。

1)    应用组件名称属性:用于标明该应用组件功能的注释性文本。

2)    应用组件在客户端应用程序上的各个界面元素属性:指客户端应用程序上的工具栏、菜单栏、下拉菜单项和列表框等用于标志该应用组件的控件上,需要应用组件提供的文本、图片、图标、菜单、事件处理方法等。

3)    初始化方法:在客户端应用程序加载应用组件时,首先执行的方法。在加载应用组件时,对于由服务器传来的配置文件中包含的各个应用组件自身的配置信息,客户端应用程序并不解析,而是将该配置信息在初始化应用组件时作为参数传递给应用组件,增加了灵活性。

4)    获取应用组件加载器方法:获取应用组件加载器后,可以通过其中包含的公共方法获取一些应用所需的共享数据。

5)    获取应用组件启动控件的方法:启动控件可以是窗体或用户控件。

6)    关闭应用组件的方法(可选):当客户端应用程序被关闭时,执行该方法。应用组件本身根据自身情况决定是否可以立即关闭,同时立即释放组件所占用的系统资源。对于MDI应用程序,可以在启动窗体的关闭事件中处理而不需要该方法。

客户端应用程序内的应用组件加载器可以通过枚举组件程序集内的类型来判断该组件是否符合借口定义。同时可以将多个应用组件打包在一个应用程序集中。此过程非常耗时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息