以WCF實作的Web Service是不是也能像ASP.Net Web Service一樣,可以在訊息傳遞的過程中加上加密保護的功能呢? 答案當然是可以的....
在[Web Service] 透過SOAP Extension進行訊息的加/解密系列文中已經簡單的介紹過了透過SOAP Extension來達到在傳送資料的過程中套上加密保護的ASP.Net Web Service與Client端的實作方式。
不過,隨著時代的進步,微軟也自.Net Framework 3.0推出之後,漸漸開始建議開發者們以WCF來實作Web Service。
那麼,以WCF實作的Web Service是不是也能像ASP.Net Web Service一樣,可以在訊息傳遞的過程中加上加密保護的功能呢? 答案當然是可以的。
讓我們來看看下面的範例(這個範例和[Web Service] 透過SOAP Extension進行訊息的加/解密系列文中的範例相同,只是服務端改以WCF來實作):
在未加上加解密功能之前,透過WPF開發的Client端一樣可以輕鬆的WCF實作的服務端取得資料。
上面這個範例的程式碼在此:
接下來,我們一樣要分別對WCF服務端和WPF實作的客戶端加上些東西,以讓資料在傳輸的過程中是有加密保護的。
與ASP.Net WebService不同之處是:在WCF中並不像ASP.Net WebService一樣有SOAP Extension讓我們使用,而是提供了IDispatchMessageInspector與IClientMessageInspector這兩個擴充介面分別供服務端與客戶端使用。
(這次的範例程式為了要讓服務端與客戶端可以共用相同的元素,因此我將可以共用的資料型態、加解密方法以及相關類別抽到共用的專案中以便參考。)
由於本範例中服務端與客戶端的加解密功能是一致的,所以我們可以先從訊息加解密訊息的部份下手:
接著運用剛才完成的加解/密訊息功能來實作IDispatchMessageInspector與IClientMessageInspector兩個介面(這兩個介面中定義好的方法其實就與SOAP Extension中訊息的四個狀態非常類似,分別是服務端收到需求後的事件及送出回應前的事件;以及客戶端收到回應後的事件和送出需求前的事件):
WCF中的擴充功能得要藉助Behavior來進行設定,所以我們得再撰寫Behavior的相關程式碼。
以本次的範例來說,我希望將MessageInspector套用到我指定的EndPoint上(其實也只有開一個EndPoint啦~),所以我們就先從實作IEndpointBehavior介面的類別開始吧(就是透過它來針對服務端和客戶端分別指派要套用的MessageInspector的喔!!):
最後,為了讓我們可以直接透過修改服務端的web.config檔就可以將服務端套上我們指定的MessageInspector,所以我們還得多實作一個繼承BehaviorExtensionElement類別的類別(有點饒舌....):
如此一來,共用的元件庫部份就完成啦!!
最後的最後,我們只需要在服務端的web.config檔中的system.serviceModel區段裡加上些設定,就可以替服務端套上MessageInspector啦:
而客戶端呢?也很簡單,只要引用共用的元件庫後再加上一行程式碼,就可以輕鬆的套用啦!!
最後(真的是最後了~),奉上完成的範例程式專案原始碼,請自行取用:
延伸資料: