前面几篇文章都说的是在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; } } } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。