温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

自定义SOAP消息头

发布时间:2020-06-20 04:48:50 阅读:1980 作者:BoyTNT 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

对于WebService调用,为了验证调用者的身份,可以自定义一个SoapHeader,让调用者将身份信息放在里面,然后在服务端检查,具体方法如下:

1、先定义一个SoapHeader,用它来传递身份信息:

using System; using System.Web.Services.Protocols;  namespace CustomSoap {     /// <summary>     /// 自定义SOAP头,从SoapHeader派生     /// </summary>     public class ServiceHeader : SoapHeader     {         /// <summary>         /// 定义用户名字段         /// </summary>         public string Name { get; set; }         /// <summary>         /// 定义密码字段         /// </summary>         public string Pass { get; set; }     } } 


2、WebService中的服务方法要修改一下:

using System; using System.Web.Services; using System.Web.Services.Protocols;  namespace CustomSoap {     [WebService(Namespace = "CustomSoap.Test")]     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]     [System.ComponentModel.ToolboxItem(false)]     public class Service : System.Web.Services.WebService     {         /// <summary>         /// 定义一个ServiceHeader对象         /// </summary>         public ServiceHeader Header { get; set; }          /// <summary>         /// 服务方法,用SoapHeader标记使用哪个头,此处是上面定义的Header属性         /// </summary>         /// <returns></returns>         [WebMethod]         [SoapHeader("Header")]         public string Hello()         {             string user = this.Header.Name;             string pass = this.Header.Pass;              //在此处可以进行身份判断,这里是写死了用户名密码             if(string.Equals(user, "root") && string.Equals(pass, "pass"))                 return "Hello root";             else                 return "Login Required";         }     } } 


3、调用者要传递身份信息:

public string CallHello() {     //ServiceProxy是针对Service.asmx生成的代理类     var proxy = new CustomSoap.Remote.ServiceProxy();      //传递身份信息     proxy.ServiceHeaderValue = new CustomSoap.Remote.ServiceHeader();     proxy.ServiceHeaderValue.Name = "root";     proxy.ServiceHeaderValue.Pass = "pass";      //调用远程方法      return proxy.Hello(); } 

调用一下,应该能收到“Hello root”,如果用户名或密码错误,会收到“Login Required”。


此时的SOAP内容会发生变化,抓一下包或者直接在浏览器上访问Service.asmx?op=Hello,可以看到请求包:

POST /Service.asmx HTTP/1.1 Host: localhost Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "CustomSoap.Test/Hello"  <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">   <!--这里多出来了Header,内容就是我们自定义的ServiceHeader-->   <soap:Header>     <ServiceHeader xmlns="CustomSoap.Test">       <Name>string</Name>       <Pass>string</Pass>     </ServiceHeader>   </soap:Header>   <!--END-->  <soap:Body>     <Hello xmlns="CustomSoap.Test" />   </soap:Body> </soap:Envelope> 


另外提一下,对于WebService,是明文的SOAP通讯,安全性上需要各位自己考虑一下方案。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×