溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

自定義SOAP消息頭

發(fā)布時間:2020-06-20 04:48:50 來源:網(wǎng)絡(luò) 閱讀:1966 作者:BoyTNT 欄目:編程語言

對于WebService調(diào)用,為了驗證調(diào)用者的身份,可以自定義一個SoapHeader,讓調(diào)用者將身份信息放在里面,然后在服務(wù)端檢查,具體方法如下:

1、先定義一個SoapHeader,用它來傳遞身份信息:

  1. using System; 
  2. using System.Web.Services.Protocols; 
  3.  
  4. namespace CustomSoap 
  5.     /// <summary> 
  6.     /// 自定義SOAP頭,從SoapHeader派生 
  7.     /// </summary> 
  8.     public class ServiceHeader : SoapHeader 
  9.     { 
  10.         /// <summary> 
  11.         /// 定義用戶名字段 
  12.         /// </summary> 
  13.         public string Name { getset; } 
  14.         /// <summary> 
  15.         /// 定義密碼字段 
  16.         /// </summary> 
  17.         public string Pass { getset; } 
  18.     } 


2、WebService中的服務(wù)方法要修改一下:

  1. using System; 
  2. using System.Web.Services; 
  3. using System.Web.Services.Protocols; 
  4.  
  5. namespace CustomSoap 
  6.     [WebService(Namespace = "CustomSoap.Test")] 
  7.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
  8.     [System.ComponentModel.ToolboxItem(false)] 
  9.     public class Service : System.Web.Services.WebService 
  10.     { 
  11.         /// <summary> 
  12.         /// 定義一個ServiceHeader對象 
  13.         /// </summary> 
  14.         public ServiceHeader Header { getset; } 
  15.  
  16.         /// <summary> 
  17.         /// 服務(wù)方法,用SoapHeader標記使用哪個頭,此處是上面定義的Header屬性 
  18.         /// </summary> 
  19.         /// <returns></returns> 
  20.         [WebMethod] 
  21.         [SoapHeader("Header")] 
  22.         public string Hello() 
  23.         { 
  24.             string user = this.Header.Name; 
  25.             string pass = this.Header.Pass; 
  26.  
  27.             //在此處可以進行身份判斷,這里是寫死了用戶名密碼 
  28.             if(string.Equals(user, "root") && string.Equals(pass, "pass")) 
  29.                 return "Hello root"
  30.             else 
  31.                 return "Login Required"
  32.         } 
  33.     } 


3、調(diào)用者要傳遞身份信息:

  1. public string CallHello() 
  2. //ServiceProxy是針對Service.asmx生成的代理類 
  3.     var proxy = new CustomSoap.Remote.ServiceProxy(); 
  4.  
  5. //傳遞身份信息 
  6.     proxy.ServiceHeaderValue = new CustomSoap.Remote.ServiceHeader(); 
  7.     proxy.ServiceHeaderValue.Name = "root"
  8.     proxy.ServiceHeaderValue.Pass = "pass"
  9.  
  10. //調(diào)用遠程方法  
  11.     return proxy.Hello(); 

調(diào)用一下,應該能收到“Hello root”,如果用戶名或密碼錯誤,會收到“Login Required”。


此時的SOAP內(nèi)容會發(fā)生變化,抓一下包或者直接在瀏覽器上訪問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,內(nèi)容就是我們自定義的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通訊,安全性上需要各位自己考慮一下方案。

 

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI