当前位置:编程学习 > 网站相关 >>

自定义SOAP消息头

对于WebService调用,为了验证调用者的身份,可以自定义一个SoapHeader,让调用者将身份信息放在里面,然后在服务端检查,具体方法如下:
1、先定义一个SoapHeader,用它来传递身份信息:
1. using System;
2. using System.Web.Services.Protocols;
3. 
4. namespace CustomSoap
5. {
6.     /// <summary>
7.     /// 自定义SOAP头,从SoapHeader派生
8.     /// </summary>
9.     public class ServiceHeader : SoapHeader
10.     {
11.         /// <summary>
12.         /// 定义用户名字段
13.         /// </summary>
14.         public string Name { get; set; }
15.         /// <summary>
16.         /// 定义密码字段
17.         /// </summary>
18.         public string Pass { get; set; }
19.     }
20. }

2、WebService中的服务方法要修改一下:
1. using System;
2. using System.Web.Services;
3. using System.Web.Services.Protocols;
4. 
5. namespace CustomSoap
6. {
7.     [WebService(Namespace = "CustomSoap.Test")]
8.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
9.     [System.ComponentModel.ToolboxItem(false)]
10.     public class Service : System.Web.Services.WebService
11.     {
12.         /// <summary>
13.         /// 定义一个ServiceHeader对象
14.         /// </summary>
15.         public ServiceHeader Header { get; set; }
16. 
17.         /// <summary>
18.         /// 服务方法,用SoapHeader标记使用哪个头,此处是上面定义的Header属性
19.         /// </summary>
20.         /// <returns></returns>
21.         [WebMethod]
22.         [SoapHeader("Header")]
23.         public string Hello()
24.         {
25.             string user = this.Header.Name;
26.             string pass = this.Header.Pass;
27. 
28.             //在此处可以进行身份判断,这里是写死了用户名密码
29.             if(string.Equals(user, "root") && string.Equals(pass, "pass"))
30.                 return "Hello root";
31.             else
32.                 return "Login Required";
33.         }
34.     }
35. }

3、调用者要传递身份信息:
1. public string CallHello()
2. {
3.     //ServiceProxy是针对Service.asmx生成的代理类
4.     var proxy = new CustomSoap.Remote.ServiceProxy();
5. 
6.     //传递身份信息
7.     proxy.ServiceHeaderValue = new CustomSoap.Remote.ServiceHeader();
8.     proxy.ServiceHeaderValue.Name = "root";
9.     proxy.ServiceHeaderValue.Pass = "pass";
10. 
11.     //调用远程方法 
12.     return proxy.Hello();
13. }
调用一下,应该能收到“Hello root”,如果用户名或密码错误,会收到“Login Required”。

此时的SOAP内容会发生变化,抓一下包或者直接在浏览器易做图问Service.asmx?op=Hello,可以看到请求包:
1. POST /Service.asmx HTTP/1.1
2. Host: localhost
3. Content-Type: text/xml; charset=utf-8
4. Content-Length: length
5. SOAPAction: "CustomSoap.Test/Hello"
6. 
7. <?xml version="1.0" encoding="utf-8"?>
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/">
9.   <!--这里多出来了Header,内容就是我们自定义的ServiceHeader-->
10.   <soap:Header>
11.     <ServiceHeader xmlns="CustomSoap.Test">
12.       <Name>string</Name>
13.       <Pass>string</Pass>
14.     </ServiceHeader>
15.   </soap:Header>
16.   <!--END-->
17.   <soap:Body>
18.     <Hello xmlns="CustomSoap.Test" />
19.   </soap:Body>
20. </soap:Envelope>

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

 
摘自 汪汪爱杨杨

补充:Web开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,