WebService开发(二) 如何使用Soap扩展 http://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788541.html

转载 2007年09月18日 16:17:00
 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。需要引用的名称空间,其中包括我封装的加密类所在的名称空间
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)
    
{
    }

}
      最后一步如何应用Soap扩展。很简单只需[MyExtensionAttribute]即可。这里用到了SoapHeader,如果你对它不是很熟悉的话,可以参考我的上一篇随笔。
public class MySoapHeader : SoapHeader
{
    
string _name;
    
string _passWord;

    
public string Name
    
{
        
get return _name; }
        
set { _name = value; }
    }

    
public string PassWord
    
{
        
get return _passWord; }
        
set { _passWord = value; }
    }

}

[WebService(Namespace = "http://DavidFan.cnblogs.com")]
public class MyService : System.Web.Services.WebService
{
    
public MySoapHeader header;

    [MyExtensionAttribute]
    [SoapHeader(
"header", Direction = SoapHeaderDirection.In)]
    
public string CheckHeader()
    
{
        
//业务逻辑.
        return "Something done";
    }

}

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

 

相关文章推荐

彩色图像为何灰度化处理?http://www.cnblogs.com/Wiseman/archive/2007/06/09/69701.html?page=4

1、图像深度是指存储每个像素所用的位数,真彩色为24位。3X8=RGB 也用于量度图像的色彩分辨率.图像深度确定彩色图像的每个像素可能有的颜色数,或者确定灰度图像的每个像素可能有的灰度级数.它决定了...
  • rns521
  • rns521
  • 2012年03月26日 10:59
  • 3294

android开发配置(转自http://www.cnblogs.com/qinpengming/archive/2011/10/19/2217948.html)

Android SDK 4.0.3 开发环境配置及运行 最近又装了一次最新版本的ADK环境 目前最新版是Android SDK 4.0.3 本文的插图和文本...

Visual studio——LightSwitch 开发入门 http://www.cnblogs.com/neozhu/archive/2011/10/06/2199798.html

lightswitch功能强大,易于对数据进行统计管理

JQuery上传插件Uploadify使用详解 http://www.cnblogs.com/oec2003/archive/2010/01/06/1640027.html

Uploadify是JQuery的一个上传插件,实现的效果非常不错,带进度显示。不过官方提供的实例时php版本的,本文将详细介绍Uploadify在Aspnet中的使用,您也可以点击下面的链接进行演示...

Hive操作语句的使用实例讲解、http://www.cnblogs.com/viviman/archive/2013/02/06/2907631.html

Hive操作语句的使用实例讲解 #创建表人信息表  person(String name,int age)  hive> create table person(name STRING,age...

hadoop使用javaAPI实现hdfs常见操作(转载于http://www.cnblogs.com/xuqiang/archive/2011/06/03/2042526.html)

. 概述  hadoop中关于文件操作类基本上全部是在org.apache.hadoop.fs包中,这些api能够支持的操作包含:打开文件,读写文件,删除文件等。 hadoop类库中最终面...

linux信号机制分析(转自http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html)

以前一直对linux的信号机制似懂非懂,今天找到了一篇好文章,讲的比较清楚,所以忍不住转了一下,原文地址为: http://www.cnblogs.com/hoys/archive/2012/08/...

http://www.cnblogs.com/menlsh/archive/2013/05/19/3087810.html

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式。    在上一篇博文《An...

http://www.cnblogs.com/xingyukun/archive/2007/10/20/931331.html

提到依赖注入,大家都会想到老马那篇经典的文章。其实,本文就是相当于对那篇文章的解读。...

http://www.cnblogs.com/YSO1983/archive/2010/06/10/1755665.html

下面我总结下我对out和ref引用参数的看法:  1.out和ref引用参数的相同点:都是通过引用传递参数给函数;  2.out和ref引用参数的不同点是:用ref引用传递参数,该参数必须经过初始...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebService开发(二) 如何使用Soap扩展 http://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788541.html
举报原因:
原因补充:

(最多只允许输入30个字)