Web Service 加入Header及Client的使用方式
Web Service一般都是直接呼叫使用,而以下的範例,則是加了Header,如果Header不對,則Client無法呼叫使用.
先從Web Service說起.
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的方式很簡單.
{
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
{
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後,就可以直接使用了
{
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