Web Service界接-如何架設附有權限之Web Service

寫在前面:
1.本測試使用傳統的Web Service,暫不涉獵WCF。
2.開發工具使用VS2008

SETP 1:新增一ASP .NET  Web  Service應用程式
新增專案

專案初始狀態


SETP 2:對Service1.asmx按右鍵選擇『在瀏覽器中檢視』
 預設WebMethod-HelloWorld

 觀察SOAP如何描述服務

由上圖可看出,HelloWorld之SOAP目前只有SOAPBody ,request無須傳值,response回傳string。接下來實作一個需要通過帳號驗證的HelloWorld,設計方式以SOAPHeader包裝。


SETP 3:設計SOAPHeader(在Service1.asmx.cs撰寫)
﹡引入適當namespace using System.Web.Services.Protocols;
﹡定義一個繼承SoapHeader類別的Class
public class HeoSoapHeader : SoapHeader
{
  public string userid;
  public string password;
}

﹡將前述自訂之SoapHeader類別(HeoSoapHeader)指定給HelloWorld()

﹡Complie專案後,於瀏覽器中檢視服務並觀察SOAP
加入自訂SOAPHeader的新HelloWorld
由上圖可看出多了< soap:Header >之tag,其中指定的userid與password則是自定義HeoSoapHeader中的兩個屬性!

﹡繼續完成結合SOAPHeader的HelloWorld
public string HelloWorld()
{
  if (heosoapheader != null)
  {
    if (heosoapheader.userid == "admin" && heosoapheader.password == "P@ssw0rd")
    {
      return "Hello!";
    }else return "驗證失敗";
  } return "未指定驗證身份。";
}

﹡Compile專案後,叫用HelloWorld()方法
 叫用HelloWorld結果
一般Web測試提供的參數輸入介面,只有WebMethod定義之參數,不包含SOAPHeader裡面的資訊,因此呼叫HelloWorld時會因缺少帳號資訊,無法成功Hello。

至此已完成"如何架設附有權限之Web Service",一旦呼叫時未一併給予SoapHeader資訊,就會因帳號驗證失敗,而回傳WebMethod自定義的錯誤訊息,無法進一步取得想要的data。
-----------------------------本文目標已達成---------------------
----想隨piggy作''如何通過Web Service帳號驗證並取得資料'',請續讀----
改寫一下前述的簡易版HelloWorld(),讓此WebMethod能連接後端DB,確實提供查詢並回傳資料,進行下一篇測試也比較有fu。以下結合LINQ技術作O/R Mapping,將HelloWorld()改為輸入''抽水站名稱'',回傳''抽水站地址''的WebMethod。


SETP 4:改寫HelloWorld()方法
LINQ非本文重點,直接來完整程式碼,給你個痛快XD
public string HelloWorld(string pumpName)
{
  if
(heosoapheader != null)
  {      
    if
(heosoapheader.userid == "admin" && heosoapheader.password == "P@ssw0rd")         {                 pumpstationDataContext context = new pumpstationDataContext();
        var result = (from p in context.pumpstation where p.NAME_C.Contains(name) select p);                 if (result.ToList().Count > 0)                   {           return result.First().ADDR_C;         }else return "查無此抽水站!";
     }else return "帳號密碼錯誤";
}else return "未指定帳號密碼";
}

沒有留言: