2. 服务器端的身份验证
这里的服务器端的身份验证,实际上就是WebServices的身份验证,虽然说从理论上Forms身份验证也是可行的,但是WebServices既然是一个A2A(Application To Application)的应用程序,那么还是尽量不要用这用更适合于人机交互的身份验证方式为好。
a) Windows身份验证
使用用户的Windows帐号如域帐号进行身份验证。
b) .Net Passport身份验证
使用与用户相关联的.NET Passport帐号进行身份验证。
c) 自定义身份验证
使用Soap来给Web服务传递账户信息是一个相对使用URL传递装户信息而言比较安全的方式,同时不必为每一个WebMethod传递证书(作为参数的一部份),如果仍然觉得不够安全则可以对Soap头进行加密,或者干脆使用Soap传递安全证书,这里只介绍使用Soap不加密传递用户名和密码进行身份验证的方式当一个服务请求发送到服务端,请求会被WebServiceAuthenticationModule截获,WebServiceAuthenticationModule就开始分析该请求的Soap头,从中解析出客户端发送的用户名和密码,并进行身份验证。如果身份验证通过,WebServiceAuthenticationModule便会给用户签发身份验证票;如果身份验证失败,WebServiceAuthenticationModule便会抛出一个消息为”Access Deny!”的SOAPException,随后服务端和客户端均可截获该异常并进行处理。
七、 Smart Client的开发原则
1. 服务器端(WebServices)的开发原则
a) 身份验证:Soap头方式
首先生成一个自定义的http模块(这里用我做的WebServiceAuthenticationModule),并在Webconfig中注册; 在Web服务类中添加一个WebServiceAuthenticationModule定义的SOAPAuthHeader字段类型,并将SOAPAuthHeader属性应用于我们的Web服务方法中,然后使用赋给这个字段类型的名称sHeader定义这个属性的构造函数; 对于客户端来说,每一次将请求发送到WebServices都需要填充Soap头,在WebServices定义了Soap头之后,客户端的代理类也会生成相应的类代理,使用时,首先创建一个服务的对象实例代表我们的Web服务,然后创建一个Soap头对象实例,并填充Soap头,接下来将Soap头与该代理程序相关联,以便使用我们的Web服务。
b) 粗粒度,较少的接口
开发WebServices应做到:粗粒度、较少的接口,从而交付与网络请求的延迟成本相称的价值。
c) 每一个.asmx文件公开较少而独立的功能,较少的数据集
这样做的目的是为了尽量减小客户端组件的大小,使用WebServices的应用程序时要生成代理类的,如果一个.asmx文件公开太多的功能和太多的程序集,势必会使客户端组件过于臃肿,而实际上它用到的可能只是其中一小部分代码而已。一般而言,一个完整的功能主要的可能只有一两张数据库表,其他的只是辅助而已。这种情况下,主表使用数据集,而辅助表甚至只需要使用数组即可。
五、 Smart Client的运行方式
1. 引导程序的运行方式
a) 本地运行
这种运行方式看起来感觉像是一个本地的应用程序,它的好处是可以帮助你控制安装目录和相关图标的创建,并可以提供简洁的卸载。坏处是您需要制作一个MSI安装文件并在客户机上Setup。
b) 网络运行
只是一种完全的网络运行方式,运行起来和你上网打开网页差不多——在浏览器地址栏里输入一个URL或者在网页上点击相应的连接。这种运行方式的好处是实现了真正的零接触部署,您不需要再客户机上安装任何东西,当然坏处也是显而易见的:它的URL路径经常可能会被诸如FlashGet之类的软件拦截而变成了下载而不是直接运行。
2. 组件的加载方式
a) 直接从网络加载
一种组件的加载方式是使用.NET框架的程序集加载器直接从网络加载,这种方式的一个好处就是简单,并且能够实现全自动的程序集更新,见如下一段代码:
b) 先下载到本地然后从本地加载
动态加载组件的另外一种方式就是先将程序集下载到本地文件夹中然后再从本地加载运行,这种方式不依赖于浏览器缓存,也就是说应用程序组件只要在运行一次之后(如果是设定为组件需要时从网络下载的话),即使离线并清空了缓存,应用程序仍然能够正常运行。其缺点是:不能自动将程序集从网络下载到本地,需要用到Windows Background Intelligent Transfer Service,不能全自动的更新程序集,需要手动编写程序集加载器,这个东东可以使用MicrosoftUpdaterApplicationBlock,并提供了全部的源代码。