[Develop]Lab1_WCF_SOA

[Develop]Lab1_WCF_SOA

說到了SOA,不知道大家會不會跟我一樣的馬上聯想的Web Service ? 近年來喊的』火紅』的Web
Service是SOA的一個具體實踐,但是並不代表Web

Service就是SOA喔。這麼說好了,SOA的其中一種實踐是Web Service。我們用』其中』這個詞,意思就是要表達SOA還有很多種其他的實踐方式。初次接

觸的人因該也會跟浩呆有一樣的疑惑,那 WCF 的定位是在哪 ?? 尤其很多範例介紹大多還是把開發好的應用程式綁定在 『wsHttpBinding'
協定上,執行

後看上去跟Web Service 實在是很像,那要WCF要幹麻呢 ? 我們這樣想,假設你想要訂必勝客 Pizza 來吃。而必勝客的櫃檯服務人員是一個類別,他提

供了訂購Pizza 的服務,那你要用什麼方式訂 Pizza 呢 ? 你可以經由打電話訂購、上網訂購、傳真訂購或是臨櫃訂購 。這些就是所謂的綁定的通訊協定

了。

這裡我們先來看一個過去在 FrameWork 2.0 時,我們所能建立的 [ ASP.NET 服務 ]。當我們在 DotNet
去建立一個 [ ASP.Net Web 服務 ] 的專案時,

DotNet 可以很簡單的幫我們建立起一個Web Service 的專案。我們在撰寫他要提供的服務(方法)就好。

clip_image001

但是這種開發就出現一個問題,萬一你開發出來的程式需要以另一種通訊方式叫用呢 ? 你將很難抽離出來,因為這個類別已經被預設在Web
Service

的http 與 SOAP 協定上了。那為什麼要抽離出來阿 ? 什麼樣的情況下我需要抽離 ? 有必要嗎 ? 首先以剛剛定Pizza的例子來說,如果必勝客只提供您

臨櫃才可以定Pizza ,那是不是很麻煩呢 ? 因為臨櫃好像是沒有什麼效率的訂購方式。SOA架構也是,雖然 Web Service
提供了你呼叫這個服務的方式

,並且也是大家比較耳熟的方式;但是他畢竟在效能上可能就會比較不是那麼的符合需求。也許在您自己的開發環境中,希望以更有效率的方式來

做溝通。那SOA這時就扮演了很彈性的 Solution。一開始乍看好像複雜化了開發方式,其實他是替未來留下了更彈性的空間。你可以依照您的需求將

您開發的類別綁定在各式各樣的通訊協定上。就像你替櫃檯服務人員提供了電話訂購、上網訂購、傳真訂購或是臨櫃訂購 這些各式各樣的』通訊方

式』。


新增一個新的WCF
Service。

在Visual Studio中開啟一個新的專案。我們選擇 WCF Service 服務,命名為 [ Lab1_FirstWCF ]。

clip_image002

我們在新增出來的專案中可以看到下列的這些檔案。

clip_image003


宣告服務合約。

你提供了什麼樣的一個服務是用[ServiceContract ]來做介面的宣告;每一個你想公佈給外界存取的方法,透過Operation來宣告。讓前端可以透過服務合

約來存取方法。

再白話一些,當你開了Pizza店,你必須定義請一個人來櫃檯服務,這個人就負責接收客戶訂購Pizza 這邊就有兩個issue。

第1 : 一個人

第2: 這個人要做什麼(提供什麼服務)

ServiceContract 是定義這個人。就是定義了一個櫃檯人員;或是廚房人員;或是外送人員每一個人(也就是一種服務類別)。

接著我們注意到了這邊的合約是宣告成 [ 介面 ],那很顯然就是要有類別來實作這個介面與介面方法。那為什麼要這樣宣告呢 ??

我們用兩個方向來思考,

第 1 : 如何訂購Pizza 好像是理所當然的問題了。我們走到Pizza店,告訴櫃檯人員我們想要的口味。而對方就會給我們我們訂購的Pizza。這是因為

我們好像已經習慣了這個行為模式了。不知道大家有沒有一種經驗,去到一家陌生的餐廳時。對方會問您,請問您有來我們這裡用過餐嗎 ?

需不需要為您介紹 ?? 當您沒有來過這家餐廳過的時候,你就不知道對方有什麼樣的餐點 ? 要如何點餐 ? 就必須仰賴服務人員的 『描述』(如果以Http

的方式來取得服務,那描述就是WSDL了 ) 來得知你可以選擇』內用』 或 『外帶』 的服務來選擇您要用餐的方式。

第 2 : 我們定義了一個Pizza 店與您溝通的服務人員介面,你可以想像這是一個職務描述。就是我們定義一個職務的描述叫做訂購櫃檯服務人員。

而我們可以聘請好幾個櫃檯人員來服務Pizza訂購的需求。但是好幾個櫃檯人員所提供的服務方式可能不同。(例如雖然都是臨櫃,像大家有去過

家樂福購物時就有看過有些結帳區是所謂的 10項貨品以下的快速結帳 。) 櫃檯人員可能也分得來速快速點餐或是一般點餐。但是他們都是編制在

公司內的櫃檯服務人員,也就是實作了櫃檯人員的介面,而在實作不同的方法內容。

這邊我們定義兩個方法, 第一個方法是傳入一個字串進去,他會回傳一個字串給你。第二個方法是傳入一個我們自行定義的composite 型別的資料進

去 ,他會回傳一個字串。

[OperationContract]
string GetData(string value);

[OperationContract]
string GetDataUsingDataContract(CompositeType composite);

clip_image004


宣告資料合約。

當你要傳遞的資料是屬於 DotNet 已經定義好的型別,無論是一般型別 或是 參考型別 問題都比較簡單。但是如果你要傳遞給方法的資料是屬於你

自定的型別,[ DataContract ] 就是用來描述資料類型的部份。

舉例來說 :

我們要訂購一個夏威夷Pizza,到底什麼是夏威夷Pizza??? 對於雙方來說,服務人員並不一定知道什麼是夏威夷口味,你可能也不知道夏威夷口味長什

麼樣子,所以 [DataContract] 是用來說明當你想要一種上面放滿鳳梨跟火腿口味的 Pizza,你該給服務人員什麼樣的資訊。

(也許還包括你要的口味、你家住址、你的聯絡電話….等等)。

在這邊我們宣告一個 [DataContract] 類別名叫CompositeType。因為剛才我們有一個方法 GetDataUsingDataContract
,他的傳入值是參照到這個型別的

資料。所以我們建立一個[DataContract] 合約。而這邊我們將參數都宣告為 Private 型態,所以我們要宣告 Get 與 Set
的方法來存取被我們封裝的參數。

宣告的 Get 與 Set 的方法必須加上 [DataMember]宣告,來告知外界。這是對外存取Private參數的方法。

clip_image005


Service
實作 IService 介面。

接著這一部份就很像你實際聘請一個人員,這個人員實作了櫃檯服務人員的介面。於是他就是一個櫃檯服務人員。( 這讓我想到大家以前有玩過

太空戰士的話,他不是有一種系統叫做轉職 ! 就是可以讓主角一下子當黑魔法師,一下子當白魔法師,一下子當龍騎士。有點類似這樣的觀念。可能

很多人聽不懂我再說什麼~~><)。在這邊我們實作了介面中宣告的兩個方法的內容,在GetDataUsingDataContract
我們將傳入的兩個值加上 Hello 後回傳

回去。

clip_image006


WCF
網路服務的進入點 。

我們在宣告了介面後,也用一個類別實作了介面。然後後面我們會將他 [系結] 到特定的通訊協定上。在這個範例中,我們是以網路服務的方式

作為細節的協定。那網路服務就要有個進入點來找到你這個服務。

[ Service="Service" ] 提供服務的名稱,也就是提供的類別。

[ CodeBehind="~/App_Code/Service.cs" ] 實際服務的程式類別位置。

clip_image007


接著到
Web.config 來做設定。

常聽到 WCF 的 ABC。WCF 在 SOA這部份做了許多的簡化讓成應用程式更簡單的能繫結在不同的通訊協定上。

A : access 提供服務的位置

B : binding 綁定的通訊協定 。綁定的通訊協定就好比是我們在文章依開始提到的;必勝客提供了一個人員(服務)來為您訂購您想要吃的Pizza。但是

這個服務人員可以接受 電話訂購、上網訂購、傳真訂購或是臨櫃訂購,這就是實體的通訊協定部份。您可以選擇您想要的方式來執行訂購行為。

C : contract 提供服務的合約

clip_image008


執行Service服務。

執行Service 服務,可以看到一個網頁服務。這個服務跟Web Service 的畫面還真的滿像的。,。,。,。,。,。

clip_image009


加入新網站。

我們在專案中加入一個新網站來呼叫剛剛撰寫好的WCF Service。

clip_image010

我們選擇 [ASP.Net 網站],並命名網站為 [ Lab1_Call_FirstWCF ]。

clip_image011


新增一個新的WCF Service。

再新建出來的 [ ASP.Net 網站 ]的部分我們選擇 [ 加入服務參考]。這個呼叫的方式類似再加入一個 [ Web service ]的操作方式。

clip_image012

然後我們加入我們建立的 WCF 服務的網址。DotNet會幫我們找到這個服務與它提供的方法。我們給他一個命名空間,叫做 [ Lab1_WCF
]。在

[ ASP.Net 網頁服務 ]的部份我們可以使用這個命名空間來呼叫這個服務裡面的內容。

clip_image013


編輯
Default.aspx 的內容。

我們在網頁中拉出兩個項目;一個是 Label 標籤,一個是 button 按紐。然後我們在 Button 上按兩下進入編輯視窗。

clip_image014

在Button1_Click 事件中我們撰寫以下的程式。首先我們建立一個[ Lab1_FirstWCF.ServiceClient ] 服務實體,這個服務實體有兩個我們在

WCF 裡面定義好的方法。再來我們建立一個資料實體 [ Lab1_FirstWCF.CompositeType ]。然後我們呼叫資料類別實體的方法來傳入我們的姓名,

然後呼叫[ Lab1_FirstWCF.ServiceClient.GetDataUsingDataContract ] 的方法來帶入值給他,並且把回覆的訊息顯示在
Label 上。

clip_image015


執行結果。

編輯完畢後,我們執行建置網頁。運氣好的話,你會看到以下的網頁出現。這就是我們經由 [ ASP.Net 網站 ]去呼叫了我們的 WCF 服務。

clip_image016