??????平时写Web Service时经常会对Service的访问进行安全控制,方法很多,这里介绍一下如何用Soap头来进行控制的一例。
??????第一步,引用需要用到的名称空间
??????第二步,建立自定义的SoapHeader类MySoapHeader
??????第三步,建立WebSerivce,MyService类有一个MySoapHeader类型的字段公共header,在客户调用CheckHeader之前需要给header付一个新实例,服务器端检验这个实例的成员信息。失败我们抛出一个SoapHeaderException,这个异常的新实例,这里调用两个参数的构造函数。第一个参数是自定义的异常原因,第二个参数我们用SoapException.ClientFaultCode表示客户的调用格式不正确或缺少必要的信息。
??????第四步,客户端进行调用,这里的MySoapHeader,和MyService类即为WSDL工具生成代理类,对应服务端的上两个类。我们首先new 一个MySoapHeader的新实例,然后付个Myservice的新实例的header字段,最后调用CheckHeader这个服务器的方法,CheckHeader方法的header!=null,接着进行Name和PassWord的验证。
客户端try-catch块内首先捕获SoapHeaderException(如果有的话)。然后捕获Exception。好了整个过程只需这几步。
??????到些为止,利用Soap头的一例简单的介绍完了,扩展应用,就由大家来发挥吧!
??????下一篇,会介绍一下Soap扩展!谢谢大家!
WebService开发(二) 如何使用Soap扩展
??????首先,介绍一下几个相关的类。System.Web.Services.Protocols名称空间下SoapExtension,SoapExtensionAttribute是两个抽象类,不能够实例化,我们要做的事情就是分别继承这两个抽象类,实现自定义类。SoapExtensionAttribute又继承自System.Attribute,说明它是一个Attribute(这个东西不太好翻译,有人译成属性之类,我考虑了一下,感觉翻译成标签更形象,为什么呢?我们用这种类时,一般会在类或方法等上方加[Attribute],这就有点像给东西贴一个标签,告诉别人这个有什么特征,作什么用途)。
??????我们开始实现自定义的SoapExtension和SoapExtensionAttribute,下边是具体代码,代码中用到了对称加密,我封装了一下MSDN里的提供的一个实现,可以下载源文件在这里 /Files/DavidFan/Encryptor.rar。需要引用的名称空间,其中包括我封装的加密类所在的名称空间
??????CheckHeader方法的实现你可以和我上一篇的MyService的CheckHeader方法作一下对比。就看出来Soap扩展的一点好处了。客户端将身份信息加密传送。服务器端拿到加密串进行解密,然后校验,不匹配则摆出异常。
??????这里只是对Soap扩展使用的一个特别的简单的举例,当然你还可以发挥,比如压缩消息,日志记录,Trace之类,网上也有很多文章讲。谢谢大家!
WebService开发(三)Web Service Software Factory
??????想了解它是什么?http://www.codeplex.com/servicefactory这里来看。
??????想要用上它,先安装dotnetfx3.exe,GuidanceAutomationExtensions.msi,Web Service Software Factory - December 2006 (refresh).msi,微软有提供下载,搜一下就找到了。安装好后,新建项目如下
??????Guidance Packages下还有一个wcf的项目模板,恰好最近园子里有人在讲一系列WCF的文章。下一步
??????看一下生成的解决方案结构
??????作为WebService的最佳实践,微软建议我们解决方案大概就是这个样子了。主要我们还是看好它的引用关系,这对理解这个框架是最好的方法。
??????1.BusinessLogic(业务逻辑)引用BusinessEntities(业务实体)和DataAccess(数据访问层)。
??????2.ServiceContracts(服务契约)引用DataTypes(数据类型)。ServiceContracts这里通常是接口的定义,我们将[WebService],[WebMethod]应用于接口和接口内方法之上,让任何类继承接口并实现,.asms文件利用<%@ WebService Language="C#" Class="实现接口的类" %>来对外发布服务。来实现操作定义(服务契约)和操作实现的分离。
??????3.ServiceImplementation(服务实现)引用BusinessEntities(业务实体),BusinessLogic(业务逻辑),ServiceContracts(服务契约)和DataTypes(数据类型)这四个层。ServiceImplementation内利用“翻译器”将DataTypes(数据类型)和BusinessEntities(业务实体)这两层进行转换,以达到服务涉及类型的松耦合。还有一个原因就是业务层的的业务对象(DataType)可能和持久层(BusinessEntities)或者数据层(DataAccess)的存储大相径庭。
??????4.WebService.Host引用ServiceImplementation,对外发布服务。
??????