WebService开发(二) 如何使用Soap扩展

      SOAP Extension(SOAP扩展)可以封装可重用的功能。比如 上一篇讲的通过Soap Header进行服务的访问控制。这篇随笔里我们要利用SOAP扩展做一下对利用Soap Header校验用户身份的封装和解决网友提出的明文传输身份信息不安全的问题。
      首先,介绍一下几个相关的类。System.Web.Services.Protocols名称空间下SoapExtension,SoapExtensionAttribute是两个抽象类,不能够实例化,我们要做的事情就是分别继承这两个抽象类,实现自定义类。SoapExtensionAttribute又继承自System.Attribute,说明它是一个Attribute(这个东西不太好翻译,有人译成属性之类,我考虑了一下,感觉翻译成标签更形象,为什么呢?我们用这种类时,一般会在类或方法等上方加[Attribute],这就有点像给东西贴一个标签,告诉别人这个有什么特征,作什么用途)。
      我们开始实现自定义的SoapExtension和SoapExtensionAttribute,下边是具体代码,代码中用到了对称加密,我封装了一下MSDN里的提供的一个实现,可以下载源文件在这里 /Files/DavidFan/Encryptor.rar。需要引用的名称空间,其中包括我封装的加密类所在的名称空间
None.gif using  System;
None.gif
using  System.Data;
None.gif
using  System.Configuration;
None.gif
using  System.Web;
None.gif
using  System.Web.Services.Protocols;
None.gif
using  David.Fan.Encrypt;
      下边是自定义的MyExtensionAttribute类,[AttributeUsage(AttributeTargets.Method)]中AttributeTargets.Method是只可以对方法应用,当然你还可以根据Soap扩展的不同功能,设置其它的应用类型。
None.gif [AttributeUsage(AttributeTargets.Method)]
None.gif
public   class  MyExtensionAttribute : SoapExtensionAttribute
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int _priority = 1;
InBlock.gif
InBlock.gif    
public override int Priority
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _priority; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _priority = value; }
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public override Type ExtensionType
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn typeof(MyExtension); }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
      接下来是MyExtension类,继承自SoapExtension
None.gif public   class  MyExtension : SoapExtension
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
//这个override的方法会被调用四次
InBlock.gif    
//分别是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize
InBlock.gif
    public override void ProcessMessage(SoapMessage message)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理
ExpandedSubBlockStart.gifContractedSubBlock.gif
        dot.gif{
InBlock.gif            
bool check = false;
InBlock.gif            
foreach (SoapHeader header in message.Headers)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
if (header is MySoapHeader)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    MySoapHeader myHeader 
= (MySoapHeader)header;
InBlock.gif                    
//解密
InBlock.gif
                    myHeader.Name = Security.Decrypt(myHeader.Name);
InBlock.gif                    myHeader.PassWord 
= Security.Decrypt(myHeader.PassWord);
InBlock.gif
InBlock.gif                    
if (myHeader.Name == "admin" || myHeader.PassWord == "admin")
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        check 
= true;
InBlock.gif                        
break;
ExpandedSubBlockEnd.gif                    }

ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
if (!check)
InBlock.gif                
throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public override Object GetInitializer(Type type)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return GetType();
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
return null;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public override void Initialize(Object initializer)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
      最后一步如何应用Soap扩展。很简单只需[MyExtensionAttribute]即可。这里用到了SoapHeader,如果你对它不是很熟悉的话,可以参考我的 上一篇随笔。
None.gif public   class  MySoapHeader : SoapHeader
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
string _name;
InBlock.gif    
string _passWord;
InBlock.gif
InBlock.gif    
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _name; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _name = value; }
ExpandedSubBlockEnd.gif    }

InBlock.gif    
public string PassWord
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
get dot.gifreturn _passWord; }
ExpandedSubBlockStart.gifContractedSubBlock.gif        
set dot.gif{ _passWord = value; }
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif [WebService(Namespace  =   " http://DavidFan.cnblogs.com " )]
None.gif
public   class  MyService : System.Web.Services.WebService
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public MySoapHeader header;
InBlock.gif
InBlock.gif    [MyExtensionAttribute]
InBlock.gif    [SoapHeader(
"header", Direction = SoapHeaderDirection.In)]
InBlock.gif    
public string CheckHeader()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
//业务逻辑.
InBlock.gif
        return "Something done";
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

      CheckHeader方法的实现你可以和我上一篇的MyService的CheckHeader方法作一下对比。就看出来Soap扩展的一点好处了。客户端将身份信息加密传送。服务器端拿到加密串进行解密,然后校验,不匹配则摆出异常。
      这里只是对Soap扩展使用的一个特别的简单的举例,当然你还可以发挥,比如压缩消息,日志记录,Trace之类,网上也有很多文章讲。谢谢大家!

转载于:https://www.cnblogs.com/DavidFan/archive/2007/04/11/707781.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值