自定义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开发 , 其他 ,