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之类,网上也有很多文章讲。谢谢大家!

 

WebService开发(一) 如何使用Soap头 http://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788539.html

平时写Web Service时经常会对Service的访问进行安全控制,方法很多,这里介绍一下如何用Soap头来进行控制的一例。      第一步,引用需要用到的名称空间using System;us...
  • cuoguo1111
  • cuoguo1111
  • 2007年09月18日 15:26
  • 548

在Eclipse中封装程序通过JDBC访问MySQL的代码

public class ConDB...{        private Connection _con;    private String _driver;    private String ...
  • Ingenuus
  • Ingenuus
  • 2007年06月21日 03:04
  • 2215

http://www.cnblogs.com/hnrainll/archive/2013/11/06/3410042.html

目录 Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器 Java垃圾回收概况   Java GC(Garbage Collectio...
  • he_you_qing
  • he_you_qing
  • 2016年08月04日 09:45
  • 919

CListCtrl控件(4)重绘CListCtrl控件的标题栏

CListCtrl控件的标题栏默认是灰色的,如果和旁边的颜色不搭配,想要修改它的颜色,如何做呢?下面给出了实现方法。 1.从CHeaderCtrl继承,新建一个类,在这里我把新建的这个类命名为CCo...
  • wang_390486690
  • wang_390486690
  • 2011年09月13日 11:38
  • 832

highchart部分按钮和头部信息的汉化

链接地址 https://www.cnblogs.com/rx100/p/4137051.html HighCharts/Highstock使用小结,使用汉化及中文帮助...
  • aliven1
  • aliven1
  • 2017年12月21日 15:07
  • 44

PHP flush 测试详解

0; $i--) {     echo $i;     flush();     sleep(1); } ?> 按照php手册里的说法     该函数将当前为止程序的所有输出发送到用户的浏览器。...
  • phphot
  • phphot
  • 2008年06月19日 23:51
  • 6795

webservice调用方式http和soap的区别

SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在I...
  • luckarecs
  • luckarecs
  • 2012年01月13日 15:19
  • 5154

HTTPclient通过soap协议访问cxf写的webservice服务端的方法。

public void testWeb() { String requestSoapData = "" + "
  • wjs3238090
  • wjs3238090
  • 2014年12月11日 13:25
  • 1633

WebService学习入门(SOAP协议,ApacheCXF入门,基于CXF技术开发CRM服务器)

webService什么是Service WebService 就是两个系统之间远程调用的技术,WebService之间的调用可以实现跨语言调用,因为调用的时Http协议,传输的数据格式为xml格...
  • uniqueweimeijun
  • uniqueweimeijun
  • 2017年08月14日 16:31
  • 363

PHP5 扩展SOAP 调用 webservice

原文地址:http://www.360doc.com/content/11/0212/16/15103_92457365.shtml# php4时代调用webservice大部分使用的n...
  • lorielei
  • lorielei
  • 2015年07月01日 10:06
  • 963
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WebService开发(二) 如何使用Soap扩展 http://www.cnblogs.com/wayne-ivan/archive/2007/06/19/788541.html
举报原因:
原因补充:

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