Welcome

首页 / 软件开发 / 数据结构与算法 / WebService开发(二) 如何使用Soap扩展

WebService开发(二) 如何使用Soap扩展2013-01-17 博客园 David FanSOAP Extension(SOAP扩展)可以封装可重用的功能。比如上一篇讲的通过Soap Header进行服务的访问控制。这篇随笔里我 们要利用SOAP扩展做一下对利用Soap Header校验用户身份的封装和解决网友提出的明文传输身份信息不安全的问题。

首先,介绍一下几个相关的类。System.Web.Services.Protocols名称空间下SoapExtension,SoapExtensionAttribute是两 个抽象类,不能够实例化,我们要做的事情就是分别继承这两个抽象类,实现自定义类。SoapExtensionAttribute又继承自 System.Attribute,说明它是一个Attribute(这个东西不太好翻译,有人译成属性之类,我考虑了一下,感觉翻译成标签更形 象,为什么呢?我们用这种类时,一般会在类或方法等上方加[Attribute],这就有点像给东西贴一个标签,告诉别人这个有什 么特征,作什么用途)。

我们开始实现自定义的SoapExtension和SoapExtensionAttribute,下边是具体代码,代码中用到了对称加密,我封装了一下 MSDN里的提供的一个实现。需要引用的名称空间,其中包括我封装的加密类所在的名称空间

using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Services.Protocols;using David.Fan.Encrypt;
下边是自定义的MyExtensionAttribute类,[AttributeUsage(AttributeTargets.Method)]中AttributeTargets.Method是只可 以对方法应用,当然你还可以根据Soap扩展的不同功能,设置其它的应用类型。

[AttributeUsage(AttributeTargets.Method)]public class MyExtensionAttribute : SoapExtensionAttribute{    int _priority = 1;    public override int Priority    {        get { return _priority; }        set { _priority = value; }    }    public override Type ExtensionType    {        get { return typeof(MyExtension); }    }}
接下来是MyExtension类,继承自SoapExtension

public class MyExtension : SoapExtension{    //这个override的方法会被调用四次    //分别是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize    public override void ProcessMessage(SoapMessage message)    {        if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理        {            bool check = false;            foreach (SoapHeader header in message.Headers)            {                if (header is MySoapHeader)                {                    MySoapHeader myHeader = (MySoapHeader)header;                    //解密                    myHeader.Name = Security.Decrypt(myHeader.Name);                    myHeader.PassWord = Security.Decrypt(myHeader.PassWord);                    if (myHeader.Name == "admin" || myHeader.PassWord == "admin")                    {                        check = true;                        break;                    }                }            }            if (!check)                throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);        }    }    public override Object GetInitializer(Type type)    {        return GetType();    }    public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute)    {        return null;    }    public override void Initialize(Object initializer)    {    }}