博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
webservice---SoapExtensionAttribute和SoapExtension
阅读量:5824 次
发布时间:2019-06-18

本文共 2262 字,大约阅读时间需要 7 分钟。

SoapExtension和SoapExtensionAttribute两个类用于控制webservice序列化和反序列化的一般过程,可对webservice进行压缩和日志等功能进行控制,关于对整个webservice传输的wsdl进行压缩的功能我没做过,不过下周有时间应该会先试试

SoapExtensionAttribute类:

public class ExtensionAttribute:SoapExtensionAttribute

    {
        int _priority = 1;

        public override int Priority

        {
            get
            {
                return _priority;
            }
            set
            {
                _priority = value;
            }
        }

        public override Type ExtensionType

        {
            get { return typeof(MyExtension); }//定义扩展soap的类型
        }
    }

 

这个SoapExtensionAttribute抽象类定义如下:

 

protected SoapExtensionAttribute();

        // 返回结果:
        //     SOAP 扩展的 System.Type。
        public abstract Type ExtensionType { get; }
        // 返回结果:
        //     SOAP 扩展的优先级。

 SOAP 扩展分配优先级,该优先级有助于确定当配置多个 SOAP 扩展以便使用 XML Web 服务方法时执行的相对顺序。SOAP 扩展的优先级越高,它的执行与通过网络发送或接收 SOAP 消息越近。SOAP 扩展属于三个优先级组中的任意一个。在每个组内,priority 属性区别每个成员。priority 属性越低,相对优先级就越高(0 是最高的)。

        public abstract int Priority { get; set; }

 

//以下为扩展的soapextension类

    public class MyExtension:SoapExtension

    {
       
        public override object GetInitializer(Type serviceType)
        {
            return GetType();
        }

        public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)

        {
            return null;
        }

        public override void Initialize(object initializer)

        {
          
        }

        //这个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 CertficateSoapHeader)
                    {
                        CertficateSoapHeader myHeader = (CertficateSoapHeader)header;

                        if (myHeader.UserName == null || myHeader.PassWord == null)

                        {                          
                            break;
                        }

                        if (myHeader.UserName.Equals("LY") && myHeader.PassWord.Equals("LY"))

                        {
                            check = true;
                            break;
                        }
                    }
                }

                if (!check)

                {
                    throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode);
                }
            }
        }
    }

 

通过SoapMessage中的stream可以获取发送和收到的流数据

上面的功能实现了soapheader的权限认证

实现上面的类后,我们就不需要在webmethod中进行判断,只需要加入相关的属性即可

如:

 

        public CertficateSoapHeader soapHeader;

        [ExtensionAttribute]
        [SoapHeader("soapHeader",Direction=SoapHeaderDirection.In)]
        [WebMethod]
        public string HelloWorld()
        {
             return "Hello World";
        }

客户端的调用和前面一样,可见在webservice中soapextension中的ProcessMessage就相当于一个拦截器,能对进入webmethod的stream进行相关的截获

测试代码如下

:下载

 

 

 

 

转载于:https://www.cnblogs.com/fujinliang/archive/2012/06/09/2542955.html

你可能感兴趣的文章
解决Windows 7中文件关联和打开方式
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
shell如何快速锁定所有账号
查看>>
HTML 5实现的手机摇一摇
查看>>
Linux 文件IO理解
查看>>
Ninject 2.x细说---2.绑定和作用域
查看>>
30个非常时尚的网页联系表单设计优秀示例
查看>>
使用membership(System.Web.Security)来进行角色与权限管理
查看>>
opticom 语音质量验证白皮书
查看>>
3D实时渲染中的BSP树和多边形剔除
查看>>
Frank Klemm's Dither and Noise Shaping Page: Dither and Noise Shaping In MPC/MP+
查看>>
网络抓包的部署和工具Wireshark【图书节选】
查看>>
Redis在Windows+linux平台下的安装配置
查看>>
Maven入门实战笔记-11节[6]
查看>>
Local declaration of 'content' hides instance variable
查看>>