.net 平台下的webservice利用soapheader自定义信息做验证

来源:互联网 发布:linux kvm宿主os 编辑:程序博客网 时间:2024/05/21 17:53

前面几篇文章都说的是在java环境下制作webservice碰到的问题,现在再来说一下在.net平台下如何获取soapheader中的自定义信息。

首先我们先看一下客户端发起请求的soap,其中header部分的CertificationProxy节点为验证信息

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">   <soap:Header>      <tem:CertificationProxy>         <!--Optional:-->         <tem:USER>xxx</tem:USER>         <!--Optional:-->         <tem:PWD>xxx</tem:PWD>         <!--Optional:-->         <tem:REQUEST_SERVER_ADDRESS>xxx</tem:REQUEST_SERVER_ADDRESS>      </tem:CertificationProxy>   </soap:Header>   <soap:Body>      <tem:HellowWorld>         <!--Optional:-->         <tem:strXmlPara>xxx</tem:strXmlPara>      </tem:HellowWorld>   </soap:Body></soap:Envelope>

在服务端的这个HelloWorld方法如下

 /// <summary>        /// HellowWorld        /// </summary>        /// <returns> HelloWorld</returns>        [WebMethod]        // 通知客户端该方法的soaphead节点名为CertificationProxy,这里CertificationProxy是代理类名而不是代理类实体变量名;        [SoapHeader("certificationProxy")]        public string HelloWorld(string s)        {            string str = "Hello World";            if (IsValidPass())            {                if (s.Equals("cnm"))                {                    return "cnm";                }                return str;            }            else            {                //return "验证未通过";                throw new Exception("验证未通过");            }        }
其中[SoapHeader("certificationProxy")]中指定的certificationProxy对象是我们对应自定义header信息所构建的类(CertificationProxy)的实例,这个类的内容如下

 /// <summary>    /// webservice认证代理类    /// </summary>    /// <remarks>    /// 作成者:cyf    /// </remarks>    public class CertificationProxy : SoapHeader    {        private string user = CWConstant.EMPTY;        private string pwd = CWConstant.EMPTY;        private string requestServerAddress = CWConstant.EMPTY;        /// <summary>        /// 用户名        /// </summary>        public string USER        {            set { this.user = value; }            get { return this.user; }        }        /// <summary>        /// 密码        /// </summary>        public string PWD        {            set { this.pwd = value; }            get { return this.pwd; }        }        /// <summary>        /// 发起请求的服务器地址        /// </summary>        public string REQUEST_SERVER_ADDRESS        {            set { this.requestServerAddress = value; }            get { return this.requestServerAddress; }        }    }
其中的 USER、PWD、REQUEST_SERVER_ADDRESS这三个属性就是用于对应请求soap中的头部信息

验证的方法(IsValidPass)可以放在一个基类里让方法所属的类去继承,这样每个方法在需要验证的时候就可以调用基类里的验证方法了。

public class WsBase : System.Web.Services.WebService    {        /// <summary>        /// 认证代理类实例        /// </summary>        public CertificationProxy certificationProxy;        /// <summary>        /// 判断请求信息是否通过认证        /// </summary>        /// <returns>        /// true:通过;false: 未通过        /// </returns>        /// <remarks>        /// 作成者:cyf                /// </remarks>        protected bool IsValidPass()        {            if (CheckUtility.IsEmpty(certificationProxy))            {                // 验证信息不存在时                return false;            }            else            {                SystemCertification sysCertificate = new SystemCertification();                // 这里添加验证操作                if (sysCertificate.InvokeSystemCertificateMethod(certificationProxy.USER, certificationProxy.PWD))                {                    // 用户名密码正确时                    return true;                }                else                {                    // 用户名密码不正确时                    return false;                }            }        }    }



原创粉丝点击