一、 Smart Client 是什么
简而言之, Smart Client 智能客户端就是这样一种一个可扩展的能集成不同应用的桌面应用程序:它可以无接触部署、即需即装、动态加载, XCopy 即可运行而无须修改注册表,可以动态升级、自动更新,可以方便的经 Web 运行而不用担心防火墙问题并可以方便的离线运用,方便的连接 WebServices 的 Windows 应用程序
二、 Smart Client 的特点
1. 动态加载,即需即装
应用程序的各个构件之间的相互调用并不采用直接引用的方式,而是采用动态加载,即需即装的方式,有效地降低了对系统资源的消耗。应用软件开发商可根据企业应用系统的公共接口进行开发,然后将应用组件发布在企业的服务器上,客户端应用程序将自动发现并加载该应用组件。
2. 更松散的耦合
由于上面第一点所言构件之间的相互调用并不采用直接引用方式,这样系统实现的更松散的耦合,为应用程序升级更新提供了方便。
3. 进一步的模块化
由于应用程序的松散耦合特性,使得系统的进一步模块化成为了可能,新功能、新特性的加入只需要开发出符合接口定义的新模块并添加连接即可。而无须修改重编译现有的程序。
4. 零接触部署
安装时只要将一个主程序文件下载到本地,直接运行即可,无须改变注册表或共享的系统组件,其他应用组件将在第一次运行时自动下载。
5. 网络加载应用程序组件
Smart Client 的应用程序可以很方便的从网络服务器加载应用程序,而且因为程序及加载是从 80 端口实现,故无须考虑防火墙问题,这样为企业系统的集中管理提供了方便。
6. 自动更新
只需将新版本的程序发布在服务器上,由客户端自动发现最新版本的程序和应用组件,并自动下载和更新。
7. 在线与离线均可使用的应用程序
Smart Client 应用程序尽管使用网络加载程序集,但一旦加载之后,程序集便被缓存到了本地。当用户至少启动了一次应用程序后,其装配就被下载和缓存到本地内存中了,所以用户就可以离线运行你的智能客户端了(通过转换浏览器到离线工作状态),假设应用程序不需要永久访问 Web services 或一个共享的数据库就可以运行。
构建智能客户端的最大的好处就是可以离线使用。尽管业务之间的联系越来越紧密,但我们仍不能给企业应用程序提供始终连续的连接。离线式工作方式可以在你重新在线时,自动接收数据和应用程序更新,这种特征是人们很想得到的,但在 .NET 前,这是很难实现的。同胖客户端一样,智能客户端给客户端分布大量的处理,这就为服务器免除了它在一个基于 Web 的应用程序中需要承担的负荷。最后,智能客户端采取一种用户希望应用程序采取的工作方式——允许快速数据存取和管理,而不需要不必要的屏幕更新。
8. 个性化用户界面
用户可根据喜好自行设置客户端应用程序,配置信息将被保存到服务器上。
9. 与 WebServices 的完美集成
Smart Client 应用程序可以与 WebServices 方便的集成应用,这样便可以轻松享受 C/S 应用程序的完美用户体验而不需担心防火墙等等的一系列问题。
三、 Smart Client 的优势
尽管有大量的广告,但瘦 Web 解决方案并没必要成为所有企业应用程序的未来。不要丢弃用 WinForms 来构建企业应用程序这种想法,因为企业应用需要集中的分布。下面的这张表格描述了 Smart Client 和瘦 Web 解决房按之间的对比:
功能
|
智能客户端
|
Web 应用程序
---|---|---
可以离线工作
|
可以
|
不容易
集中的部署
|
可以
|
可以
高级的 GUI 特征
|
有
|
有
高性能的 GUI
|
可以
|
不可以
卸载处理到客户端
|
可以
|
有限
通过 HTTP 更新
|
可以
|
可以
安全
|
是
|
是
不接触客户端安装
|
不是;需要构建用来改变 .NET 的安全配置的一个加载应用程序(除非你用的是 Microsoft Transaction Server 或 Citrix ,但是那样的话,应用程序就只能在线使用)
|
是
大部分时间只传输数据
|
是
|
不是;结合内容的传输, .NET 控件显示在 IE 中
客户端需要 .NET Framework
|
是
|
不是
平台和客户端是独立的
|
不是
|
是
适合电子商务或 Internet 应用程序
|
不是;最适合企业内部应用程序
|
是
充分利用客户端丰富的资源
|
可以
|
不能
表 1 比较两者
通过将智能客户端的功能和 Web 应用程序的功能进行比较,可以简化你的决策过程。
四、 Smart Client 的工作模型

图 1. 智能客户端的工作模型
应用程序加载器用 HTTP 从 Web 服务器上的一个虚拟目录来访问和下载装配。下载后,装配被缓存起来,只有需要的时候才执行它们。
五、 Smart Client 的运行方式
1. 引导程序的运行方式
a) 本地运行
这种运行方式看起来感觉像是一个本地的应用程序,它的好处是可以帮助你控制安装目录和相关图标的创建,并可以提供简洁的卸载。坏处是您需要制作一个 MSI 安装文件并在客户机上 Setup 。
b) 网络运行
只是一种完全的网络运行方式,运行起来和你上网打开网页差不多——在浏览器地址栏里输入一个 URL 或者在网页上点击相应的连接。这种运行方式的好处是实现了真正的零接触部署,您不需要再客户机上安装任何东西,当然坏处也是显而易见的:它的 URL 路径经常可能会被诸如 FlashGet 之类的软件拦截而变成了下载而不是直接运行。
2. 组件的加载方式
a) 直接从网络加载
一种组件的加载方式是使用 .NET 框架的程序集加载器直接从网络加载,这种方式的一个好处就是简单,并且能够实现全自动的程序集更新,见如下一段代码:
using System.Reflection;
//网络运行方式,加载的程序集路径为服务器上的url地址
assemblyFileName = "http://SmartClient/AppComponent1.dll";
Assembly asm = Assembly.LoadFrom(assemblyFileName);
寥寥数句 , 便实现了程序集的网络加载 , 其关键的一句就是 Assembly.LoadFrom(assemblyFileName) 。
当然这种方式虽然简单但也有其坏处,那就是这种方式非常地依赖于浏览器的缓存机制,一旦缓存被清空,程序便无法再离线工作,这是一个很麻烦的问题。
b) 先下载到本地然后从本地加载
动态加载组件的另外一种方式就是先将程序集下载到本地文件夹中然后再从本地加载运行,这种方式不依赖于浏览器缓存,也就是说应用程序组件只要在运行一次之后(如果是设定为组件需要时从网络下载的话),即使离线并清空了缓存,应用程序仍然能够正常运行。其缺点是:不能自动将程序集从网络下载到本地,需要用到 Windows Background Intelligent Transfer Service ,不能全自动的更新程序集,需要手动编写程序集加载器,这个东东可以使用 MicrosoftUpdaterApplicationBlock ,并提供了全部的源代码。
3. 组件的呈现方式
这里谈到的组件当然是指界面组件,如果不涉及到用户界面,当然也就谈不上什么呈现方式了。
a) 组件加载后隐藏引导程序
作为一种很常见的组件呈现方式,程序集作为窗体来实例化,然后使用 Form.Show() 方法呈现,而将引导窗体以 Form.Hide() 方式隐藏。
b) 组件作为承载平台的子窗体
而在将组件作为子窗体的呈现方式中,是将承载平台设计为 MDI 窗体,然后将装载的组件的 ParentForm 属性设置为承载平台来显示。
c) 组件作为承载平台的控件
在这种方式中,组件不以窗体的方式来实例化,而是以用户控件的方式实例化,然后将其动态添加到承载窗体的某一个托盘中(通常是 Panel )。
六、 Smart Client 的安全性问题
1. 客户端的代码访问安全( CAS )
说到 Web 方式直接运行,就不能不谈到代码访问安全性( Code Access Security )问题,如果一个黑客能够说服或者诱使你下载一段代码,而你在很高的权限账户下运行它,那操作系统就对各种危害门户打开。这种情形就是导致著名的宣言 “ 在最小权限下运行 ” 的原因,每个人都应该注意这一点。
但是, .NET Framework 提供了比这种单纯的基于身份的安全性更高级的功能。由 CLR 强制执行的 CAS 机制允许为代码(实际上是 assembliy , .NET Framework 中调度和保护的单位)指定基于属性的不同的可信度等级,例如数字证书或源站点或 URL 。在这种方式下, .NET Framework 只允许已知的或受信的源代码执行。
为了让你的智能应用程序运转,你需要改变一些客户端的安全设置——实质上就是通知客户端运行时间相信你的应用程序的装配。一种方法就是将带有你的装配的站点添加到 IE 中可信任站点清单中,然后用安装在你的管理工具目录下的 Microsoft .NET Framework Configuration 工具来修改 .NET Framework 安全设置。打开 Framework Configuration 工具,右击 Runtime Security Policy ,然后选择 Adjust Security 。对于 Trusted Sites 中指定的所有站点,将信任级别调整到 Full Trust 。作为选择,你也可以用 Framework Configuaration 工具来修改安全策略,使它信任你的应用程序的个别装配。右击 Runtime Security Policy <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; m