WCF一點心得

前面隨手寫下5篇WCF討論,服務大多是包在網站中,直接供網站引入參考,前2天向同事詢問FLEX後端使用的服務,才發現自己並沒有把後端的運作思維理得很清楚,因此昨日開始著手建立1個可以connect後端資料,以服務方式回傳SQL資料庫的服務,完成後再相比之前幾篇範例,總算是有把握以後可以將各類服務逐步架設起來,或許SOA的concept不遠矣cc

暫且回憶之前5篇文主要宗旨
1.初學WCF:快速上手WCF,熟悉WCF開發介面
2.建立您的第一個WCF服務(複雜版):深入瞭解合約之製作與使用時機
3.建立您的第一個WCF服務(精簡版):同上
4.在Silverlight中透過WCF&LINQ使用SQL:LINQ負責提供實體,讓SQL資料庫藉WCF提供資料,更以Silverlight為展現介面
5.部署您的WCF服務:發佈WCF

以上化繁為簡,就2、4比較
2:WCF(WCF服務程式庫)、無DB
4:WCF(有Silverlight功能的WCF服務)&Linq&Silverlight、有DB

而我的目的是建置1個可協助取回資料的單純WCF,也就是說不要採用「有Silverlight功能的WCF」這種快速建立方式,而是建立1個獨立存在,可供各端採用的服務!以下的實作概念便是採模式2但是要跟4一樣能touch後端資料庫!


以下詳列各步驟,並說明步驟緣由 :
1.新增專案→WCF服務程式庫
 您也可選擇WCF服務應用程式,本文要一併呈現製作與使用服務之DLL,故採用程式庫

2.刪除Service1.vb與IService1.vb
有意義的服務命名方便日後使用,因此摒棄預設的Service1,將兩個檔案直接刪除,或是您想用重新命名的方式亦可!
piggy建議直接刪除, 作完步驟3、4後您會馬上感受到刪除的便利性!

3.刪除App.config部分內容
清空內容是因為Service1已於上一步驟捨棄,無須記錄其binding各項設定!
刪除後的cinfig檔如下所示
< ?xml version="1.0" encoding="utf-8" ?>
< configuration>
  < system.web>
    < compilation debug="true" />
  < /system.web>
  < system.serviceModel>
    < services>
    < /services>
    < behaviors>
    < /behaviors>
  < /system.serviceModel>
< /configuration>

4.加入新增項目→WCF服務
本文新增一名為PK之WCF,專案將自動產生PX.vb與IPK.vb兩個檔案。仔細觀察App.config的變化,步驟3 highlight部分自動變成如下設定
    < services>
      < service behaviorConfiguration="WcfQuerySQL.PKBehavior" name="WcfQuerySQL.PK">
        < endpoint address="" binding="wsHttpBinding" contract="WcfQuerySQL.IPK">
          < identity>
            < dns value="localhost" />
          < /identity>
        < /endpoint>
        < endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        < host>
          < baseAddresses>
            < add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfQuerySQL/PK/" />
          < /baseAddresses>
        < /host>
      < /service>
    < /services>
    < behaviors>
      < serviceBehaviors>
        < behavior name="WcfQuerySQL.PKBehavior">
          < serviceMetadata httpGetEnabled="true" />
          < serviceDebug includeExceptionDetailInFaults="false" />
        < /behavior>
      < /serviceBehaviors>
    < /behaviors>

5.加入新增項目→LINQ to SQL類別
此類別命名為TownClass(DB資料表為鄉鎮市行政區資料),由伺服器總管拖曳任一資料表至TownClass.dbml可視化介面,並更改序列化屬性為單向。(詳細操作畫面請參考此文步驟3&4)
請觀察TownClass.designer.vb檔案,拖曳表格完畢後,本檔案將自動產生該資料表相對應的實體,也就是為您省去mapping的動作!

6.定義服務介面(Interface),亦即IPK.vb檔案
Interface通常會定義OperationContractDataContract,簡單來說就是方法資料型別,這邊我們只定義方法,資料定義已交由前一步驟的TownClass
在此定義一個獲取鄉鎮市資料的方法,透過關鍵字比對取回相符資料,code如下
    < OperationContract()> _
    Function GetTownByKeyword(ByVal townname As String) As List(Of TOWN)
PS:預設Sub DoWork()要記得刪除

7.實作服務介面,亦即PK.vb檔案
利用IntelliSense在 Implements  IPK後按下Enter自動產生必須實作的方法如下
Public Function GetTownByKeyword(ByVal townname As String) As System.Collections.Generic.List(Of TOWN) Implements IPK.GetTownByKeyword
    '撰寫方法如何實作的內容
End Function

方法如何實作的內容
Dim db As New TownClassDataContext
Dim matchingTown = From townCollection In db.TOWN  _
                  Where townCollection.TOWNNAME.Contains(townname)  _
                  Select townCollection
Return matchingTown.ToList
PS:預設Public Sub DoWork() Implements IPK.DoWork要記得刪除

8.F5


循上列步驟可成功建立一獲取SQL資料的WCF服務,無論前端是否以Silverlight開發,服務的完整建立將有利於後續各類專案的開發!

廢話:服務的部署請參考此文,這幾天找時間補齊本服務部署,深入說明部署時需要手動更改的部分和已建立的WCF有何關係,讓本文更臻完善並系統化,希望日後建立WCF有一個較佳流程可參照^-^

以下提供不負責任參考網址,與本文關係不大但寫的不錯,初學者可看看
Writing the WCF Hello World App
Host a WCF Service in IIS 7 & Windows 2008


 2010.2.3繼續補齊服務部署

9.在方案中加入新增項目→ASP.NET網站
前面WCF是以服務程式庫的方式建置,最終是產製DLL,而部署服務需要的是SVC,因此需要先加入一個空白的ASP.NET來協助裝載。

10.在ASP.NET網站加入新增項目→WCF服務
服務命名為PKService,網站之App_Code資料夾會自動產生PKService.vb與IPKService.vb,網站跟目錄則是PKService.svc

11.刪除App_Code資料夾內的2個檔案
 因為我們已經在步驟1-8實作服務了!不再需要這2個檔案!

12.在網站加入服務參考
也就是將WCF產製的DLL加入網站,讓Bin資料夾有DLL可參考
畫面請參考HERE步驟3

13.修改PKService.svc
服務已經實作了,所以把CodeBehind刪除,接著將Service指向WcfQuerySQL.PK
要在網站中host我們的服務,要先configure svc檔案(這邊我把Service.svc改成eval.svc)
修改前:<%@ ServiceHost Language="VB" Debug="true" Service="PKService" CodeBehind="~/App_Code/PKService.vb" %>
修改後:<%@ ServiceHost Language="VB" Debug="true" Service="WcfQuerySQL.PK" %>

 ★修改SVC檔案時是沒有IntelliSense可以用的,那要怎麼確保我們指向的服務是正確的?
請打開網站的web.config尋找以下資訊
< service behaviorConfiguration="PKServiceBehavior" name="WcfQuerySQL.PK">
 由此可看出加入服務參考之時,web.config亦一併將服務端點等資訊設定好!裡面的name屬性WcfQuerySQL.PK就是要指向的服務!

12.編輯WCF組態
參考HERE步驟5

13.刪除web.config中不需要的部分
< configSections >.....到< / system.webServer >都刪掉!

14.測試
在瀏覽器中檢視PKService.svc或以Visual Studio 2008 命令提示字元測試
參考HERE步驟7

15.IIS建立名為PK_SQL的虛擬目錄
路徑請指向新網站的根目錄,參考HERE步驟8、9



以上~從無到有順利完成一個可取回後端資料庫的WCF服務!
之後再寫一篇以Silverlight運用服務的小範例,從中瞭解如何叫用服務、接收資料。

沒有留言: