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

SOAP 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)

    {

    }

}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索封装
, using
, webservice 自定义类
, system
, override
, public
, SoapExtensionAttribute
SOAP扩展
soap webservice、soap webservice 实例、java soap webservice、soap调用webservice、webservice soap协议,以便于您获取更多的相关知识。

时间: 2024-10-28 17:02:58

WebService开发(二) 如何使用Soap扩展的相关文章

PHP使用SOAP扩展实现WebService的方法_php技巧

本文实例讲述了PHP使用SOAP扩展实现WebService的方法.分享给大家供大家参考,具体如下: 最近在一个PHP项目中对接外部接口涉及到WebService,搜索引擎上相关文章不是很多,找到的大都是引用一个号称很强大的开源软件NuSOAP(下载地址:http://sourceforge.net/projects/nusoap/),即一些类.文章写描述的环境是PHP 4.3,现在都流行PHP 5.2或PHP 5.3了.先拿来试试,运行出错,原来NuSOAP提供的soapclient类与PHP

php 用自带soap扩展调用webservice。老是报错cannot load from。。

问题描述 php 用自带soap扩展调用webservice.老是报错cannot load from.. 我用的wamp2.5集成环境,php里面的soap扩展也都打开了.却一直无法成功调用webservice,总是报cannot load from的错误. 刚刚卸载了wamp2.5.装了一个wamp2.4,还是不成功,后来又重新安装了wamp2.5,重启了一下电脑,突然就能调用webservic 了.太郁闷了,有大神遇到过同样的问题么. 解决方案 灵异事件经常会碰到,原因神马的已经不重要了,

在使用webservice开发时,然后有一个地方要传入String类型&Long类型,然后就是...

问题描述 在使用webservice开发时,然后有一个地方要传入String类型&Long类型,然后就是... 我的代码块Long stateId = null; Call call = constructCall(url); try { call.setTargetEndpointAddress(new java.net.URL(url)); } catch (MalformedURLException e) { e.printStackTrace(); } call.setOperation

webservice接口开发-Webservice开发单点登录接口怎么实现,有具体代码实例更好

问题描述 Webservice开发单点登录接口怎么实现,有具体代码实例更好 现在要实现一个单点登录功能的接口,请问该如何实现这个功能?使用webservice开发的接口来实现它. 解决方案 既然是两个工程,那就一个做客户端,一个做服务端了,服务端可以把服务发布出来,客户端进行调用,就可以了啊,分布式开发.. 解决方案二: 你去东软帝国这个网站看看,里面有一个,不值得是不是基于webservice的

httpclient做抓取,最后一步的抓取是感觉是webservice,请求报文是SOAP类型的xml

问题描述 httpclient做抓取,最后一步的抓取是感觉是webservice,请求报文是SOAP类型的xml.请问怎么用httpclient模拟啊 解决方案 解决方案二:没看懂,就是httpclient模拟,然后返回数据解决方案三:是的,返回这错org.eclipse.birt.report.exception.ViewerException:Theviewingsessionisnotavailableorhasexpired.atorg.eclipse.birt.report.servl

利用PHP SOAP扩展实现简单Web Services

WebServices能干什么?   WebServices 可以将应用程序转换为网络应用程序.   通过使用 WebServices,您的应用程序可以向全世界发布信息,或提供某项功能.       好了,关于WebServices网上资料很多,就不过多介绍了,直接进入主题.   PHP有两个扩展类库可以实现WebServices,一个是NuSoap,一个是php官方自带的Soap扩展,在使用上大致都差不多,就拿官方自带的Soap扩展来说吧.   在Soap编写WebServices中主要用到了

spring ws-spring webservice开发问题

问题描述 spring webservice开发问题 我用spring-ws做web service服务端,参考http://white-crucifix.iteye.com/blog/2068853.服务发布成功,可以访问WSDL文件,也可以用spring的WebServiceTemplate调用成功, 我再用axis2调用的时候,会收到这个错误 2015-05-08 14:53:01,840 INFO HTTPSender - Unable to sendViaPost to url[htt

C#的百度地图开发(二)转换JSON数据为相应的类

原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON数据,我们先将这个JSON数据,使用在线工盯进行格式化. [html] view plaincopy {       "status": 0,       "result": [           {               "x": 39.9

【ANDROID游戏开发二十七】讲解游戏开发与项目下的HDPI 、MDPI与LDPI资源文件夹以及游戏高清版本的设置

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/389.html 今天一个开发者问到我为什么游戏开发要删除项目下的hdpi.mdpi和ldpi文件夹:下面详细给大家解答一下: 首先童鞋们如果看过我写的<[Android游戏开发二十一]Android os设备谎言分辨率的解决方案!>这一节的话都应该知道Android从1.6和更高,Google为了方便开发者对于各