智能客户端SmartClient (四)
四、发布程序
1、在发布和更新服务器上设置一个虚拟目录(如:SmartClient)将应用组件的所有文件放置在相应的目录下。
虚拟目录的设置属性中必须包括:读取和目录浏览权限,执行许可为纯脚本。
对于本地运行方式,需要根据客户端应用程序的版本号设置多个目录,每个目录存放不同版本的所有文件。(也可以在新版本目录下只存放更新了的文件,但需要修改更新组件。当用户更新版本时,必须下载大于当前版本的所有新版本目录下的文件,以防止某些情况下会出现某个版本的文件被遗漏的问题)。
在本地运行方式中,还需要在根目录下维护一个更新版本清单文件,因为它允许用户以老版本客户端应用程序登录。
2、发布一个Web Service。该Web服务主要完成以下任务:
· 执行客户端用户的身份验证
· 从整个应用系统的安全模块中获取该用户允许执行的应用组件的清单,包含应用组件的位置、文件名称和应用组件本身所需的配置信息。(在本地运行方式下,该清单还和版本有关)
· 从数据库中获取该用户的个性化配置信息,和上一步获取的信息合并为一个XML文件流。
· 将该配置文件流作为返回参数返回给客户端应用程序。
3、将客户端应用程序放置在虚拟根目录下作为应用组件程序集的加载器,同时在企业内部网站上增加一个指向客户端应用程序的链接。对于网络运行方式,还将提供一个安全策略部署包(MSI)文件的链接。
用户第一次运行时的执行步骤。
网络运行方式:
· 下载并安装安全策略部署包
· 通过点击客户端应用程序的链接,下载并执行客户端应用程序
· 将该链接添加到收藏夹中或建立桌面快捷方式,以便于运行
本地运行方式:
· 不直接点击客户端应用程序的链接,将此链接另存到用户选择的目录下
· 在资源管理器中执行客户端应用程序
· 在桌面上建立可执行文件的快捷方式,以便于运行
五、更新程序
网络运行方式的更新步骤较为简单,只须将更新了的文件直接覆盖老文件即可。其缺点是某些程序集附带的引用文件不能自动下载新版本,只有清空客户端的IE缓存后才能实现更新。
本地运行方式的更新步骤如下:
# 在服务器虚拟根目录下新建一个以新版本号命名的目录,增量更新只需将更新了的文件复制到该目录下,否则需要将所有文件都复制到目录。
# 修改保存所有版本清单的文件,并指明当前活动的最新版本号,用于和客户端进行版本比较。
六、扩展应用组件
为了实现企业应用系统的可扩展性,通过接口定义,可以使应用开发商通过实现这些接口将自己的应用组件方便的添加到客户端应用程序中。以下介绍一些接口中主要包含的方法和属性。
1、 应用组件名称属性:用于标明该应用组件功能的注释性文本。
2、 应用组件在客户端应用程序上的各个界面元素属性:指客户端应用程序上的工具栏、菜单栏、下拉菜单项和列表框等用于标志该应用组件的控件上,需要应用组件提供的文本、图片、图标、菜单、事件处理方法等。
3、 初始化方法:在客户端应用程序加载应用组件时,首先执行的方法。在加载应用组件时,对于由服务器传来的配置文件中包含的各个应用组件自身的配置信息,客户端应用程序并不解析,而是将该配置信息在初始化应用组件时作为参数传递给应用组件,增加了灵活性。
4、 获取应用组件加载器方法:获取应用组件加载器后,可以通过其中包含的公共方法获取一些应用所需的共享数据。
5、 获取应用组件启动控件的方法:启动控件可以是窗体或用户控件。
6、 关闭应用组件的方法(可选):当客户端应用程序被关闭时,执行该方法。应用组件本身根据自身情况决定是否可以立即关闭,同时立即释放组件所占用的系统资源。对于MDI应用程序,可以在启动窗体的关闭事件中处理而不需要该方法。
客户端应用程序内的应用组件加载器可以通过枚举组件程序集内的类型来判断该组件是否符合借口定义。同时可以将多个应用组件打包在一个应用程序集中。此过程非常耗时。
示例:
//根据程序集文件名称,加载程序集
Assembly asm = Assembly.LoadFrom(assemblyFile);
Type[] types = asm.GetTypes();
//搜索程序集中的所有类型
foreach (Type t in types)
{
//指示类型是否由引用封送,支持远程处理
if (!t.IsMarshalByRef)
continue;
//判断该程序集的类型是否有符合应用组件接口的类型
if (Array.IndexOf(t.GetInterfaces(), pluginType) < 0)
continue;
}
小结
上述仅仅是对创建智能客户端应用程序作了简单的描述和示范,并对其中可能遇到的问题给与了必要的解释,希望能对您创建更为强大、灵活、便捷的应用程序提供帮助。