WebService Header的運用 C# VS2005 Sample Code

Web Service 加入Header及Client的使用方式

Web Service一般都是直接呼叫使用,而以下的範例,則是加了Header,如果Header不對,則Client無法呼叫使用.

先從Web Service說起.

using System;
using System.Data;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;


namespace WSHeaderWS
{
    /// <summary>
    ///Service1 的摘要描述
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]

    public class Service1 : System.Web.Services.WebService
    {
        public Service1()
        {
            if (Context.Request.Headers.Count < 2)
            {
                throw new Exception("Access Deny");
            }

            string[] AccID = Context.Request.Headers.GetValues("AccID");
            string[] AccPWD = Context.Request.Headers.GetValues("AccPWD");
            if (AccID == null || AccPWD == null)
            {
                throw new Exception("Access Deny");
            }

            if (AccID.Length < 1 || AccPWD.Length < 1)
            {
                throw new Exception("Access Deny");
            }

            if (AccID[0] != "123456" || AccPWD[0] != "654321")
            {
                throw new Exception("Access Deny");
            }

        }


        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

    }

}

 

從以上的Code可以看到,會先判斷Header存不存在,如果不存在,則Access Deny,如果存在,就判斷AccID及AccPWD是否正確,如果不正確,也是Access Deny.

而可以呼叫的WebMethod為HelloWorld().

這樣就做好Web Service端的Header部份的動作,而接下來Client就要使用這個WS.所以一定要先加入Web參考.

Client端的一般呼叫WS的方式很簡單.

try
{
    HW.Service1 ws = new WSHeaderCL.HW.Service1();
    MessageBox.Show(ws.HelloWorld());
}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

這個程式呼叫HelloWorld一定會跳Exception,因為沒有Header.

所以要加入Header才能執行,做一個Demo畫面,用來測試,如果當Header的值有誤時,會怎麼樣.

不含Header即是前一個範例,而接下來要做的是含Header的部份.

首先先產生一個ProxyWeb的Class(名字隨個人高興),因為我的WS是用HW命名,所以是HW.Service1

public class ProxyWeb : HW.Service1
{
     private System.Collections.Specialized.NameValueCollection headers = new System.Collections.Specialized.NameValueCollection();
    public ProxyWeb(string ID,string PWD)
    {
        headers.Add("AccID",ID);
        headers.Add("AccPWD", PWD);
    }

    protected override System.Net.WebRequest GetWebRequest(System.Uri uri)
    {
        System.Net.WebRequest request = base.GetWebRequest(uri);
        request.Headers.Add(headers);
        return request;
     }

}

有了這個Class後,就可以直接使用了

try
{
    ProxyWeb ws = new ProxyWeb(txt_ID.Text.Trim(),txt_PWD.Text.Trim());
    MessageBox.Show(ws.HelloWorld());
}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

用法一樣,只是在new ProxyWeb時,傳入ID及PWD,沒什麼特別的步驟.呼叫其它的WebMethod也不需再去寫另個Class或什麼的,用法都一樣,除非是另一個Web Service,才需要再寫一個Class.

測試結果,當然ID及PWD符合時,才會跳出HelloWorld,不然都是Access Deny.

而ProxyWeb除了可以加Header外,也可在這邊指定Web Service的Url,因為有些人的WS的Url是動態的,所以可以在ProxyWeb的這個Class指定就好.

 

這個的應用方式很多,不是像我這樣的簡易驗證,也可用來傳一些共用的固定值,例如UserID,我這只是Demo做法.

如果有更好的做法或寫法,也感謝各位的分享.

 

原始碼 :

Client : WSHeaderCL.zip

Web Service : WSHeaderWS.zip