天天看點

自定義SOAP消息頭

對于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; } 

        /// 定義密碼字段 

        public string Pass { get; set; } 

    } 

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

using System.Web.Services; 

    [WebService(Namespace = "CustomSoap.Test")] 

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 

    [System.ComponentModel.ToolboxItem(false)] 

    public class Service : System.Web.Services.WebService 

        /// 定義一個ServiceHeader對象 

        public ServiceHeader Header { get; set; } 

        /// 服務方法,用SoapHeader标記使用哪個頭,此處是上面定義的Header屬性 

        /// <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通訊,安全性上需要各位自己考慮一下方案。

     本文轉自 BoyTNT 51CTO部落格,原文連結:http://blog.51cto.com/boytnt/837345,如需轉載請自行聯系原作者

繼續閱讀