顯示具有 WCF 標籤的文章。 顯示所有文章
顯示具有 WCF 標籤的文章。 顯示所有文章

WCFTestClient

使用WCF好一陣子,一些小技巧都靠自己慢慢摸索,前陣子介紹同事使用WCFTestClient(WCF測試用戶端)本想寫篇文,但此技巧幾行文就可結束便放棄:P
上上禮拜使用WCFTestClient針對Request為List的WCF進行測試,遭遇到不知該如何傳遞List來進行測試之窘境,所幸下了幾個英文keyword馬上找到solution,趁此機會便一次把WCFTestClient二個小技巧說明白唄!


SETP 1:開啟Visual Studio 2010 命令提示字元
開始→程式集→Microsoft Visual Studio 2010→Visual Studio Tools→Visual Studio Command Prompt (2010)



SETP 2:輸入呼叫指令
輸入wcftestclient(無分大小寫)按下Enter,測試視窗旋即出現


SETP 3:新增欲測試之WCF



SETP 4:開啟要測試之WebMethod
對某個input parameter為List的WebMethod連按2下,視窗右側將出現Request / Response窗格


SETP 5:修改預設的length=0
依據WebMethod的Response實際大小修改length長度,例如Response是一大小為3的List,請將length=0改為length=3。
更改長度後,length左邊多了+/-號,變成可收合的樹狀結構,
展開後即可依序填入List內各value


SETP 6:輸入測試值
輸入完畢按下Invoke,若出現Security Warning警示訊息,按下OK即可。


SETP 7:測試完畢
Response區塊呈現成功回傳的N筆資料(length=N)。


[另一個小技巧]
1.SETP1在VS2008亦同。
2.可以像piggy一樣多利用List包裝多維資料,因為List大小能動態改變,本例GetResult1便是針對相同資料,使用者可能會採用6種不同查詢方式設計撰寫,不用為了相異的需求而獨立寫6種WebMethod!

ADO.NET Data Services更名

相信眼尖的朋友早已發現NET4.0的ADO.NET Data Services不見哩!其實只是改變名稱為WCF Data Services,被歸在WCF這一類。

附上一小段原文引述及其網址
WCF Data Services (以前稱為 "ADO.NET Data Services") 包含模式與程式庫組合,可讓您建立及存取 Web 或內部網路的資料服務。WCF Data Services 會將資料公開為可由 URI 定址的資源。這可讓您使用具像狀態傳輸 (REST) 的語意存取及變更資料,尤其是標準 HTTP 動作,例如 GET、PUT、POST 和 DELETE。

VS2008開發Silverlight小技巧

之前寫過VS2008搭配BLEND3,主要是兩套軟體的搭配使用~~
今天發一篇VS2008在開發Silverlight時需要注意的小撇步...同樣也是陸陸續續更新


1.WCF使用的資料實體之定義會影響Silverlight
Silverlight接資料是透過服務,以我的開發習慣~目前是採用WCF來架構service,雖然服務重用性(reuse)高~但要小心!Silverlight寫死的binding並不會自己偵測到服務端的變化喔。請注意以下2點
實體定義的Name屬性有更動,silverlight的binding欄位也要隨著變更為新的Name!
*上一項變更完畢,除了將silverlight使用的服務參考更新,還要記得重建(Rebulid)~不然xap是舊版的,可能會bind不到資料!


2.Silverlight使用者控制項、Silverlight頁面
Silverlight使用者控制項--使用.NET以提供豐富Web設計元素的Silverlight使用者控制項
包住整個頁面
Silverlight頁面--包含 Silverlight 應用程式部分的頁面,該頁面可透過框架內的巡覽功能取得
包住整個頁面

就我目前使用的情況來看,如果從頭到尾都選擇< UserControl>< /UserControl>來作XAML,除了於前置詞手動加入『xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"』,其他部分都一樣~設計上並沒有差異!
ps:記得更改App.xaml.vb的出場頁面

Silverlight跨網域存取

有摸Silverlight的朋友想必都知道存取後端要透過服務代勞,無法像傳統ASP.NET直接連接DB,在網站與服務架設完成後,多數人常會遇到cross domain的問題,此時要在clientaccesspolicy.xml中設定跨網域資訊,允許哪些網域的Silverlight可以存取服務!想當然爾,clientaccesspolicy.xml要放在服務這邊,但是不少人測試時把服務、Silverlight放在本機,可能不會注意到此細節喲!

< ?xml version="1.0" encoding="utf-8"?>
< access-policy>
  < cross-domain-access>
    < policy>
      < allow-from http-request-headers="*">
        < domain uri="*"/>
      < /allow-from>
      < grant-to>
        < resource path="/" include-subpaths="true"/>
      < /grant-to>
    < /policy>
  < /cross-domain-access>
< /access-policy>

< domain uri="*"/>是指定可以通過的網域,這邊耍懶就讓所有網域內的Silverlight都可存取本地服務:p

另一個重點是clientaccesspolicy.xml要放哪裡?
引據董大偉老師Silverlight範例權威講座2.0,此檔必須放在網站根目錄,摘錄如下
網站的根目錄指的並不是是虛擬目錄的根目錄,倘若你的網站是虛擬目錄,你放在虛擬目錄的根目錄(就是和Web.config同一個目錄)下是無效的,你需要把.xml檔案放到該虛擬目錄所屬的網站的根目錄下才有效。
舉個例子簡單來說:WCF的實際的網站路徑在D:\test\AA,同時也於IIS以虛擬目錄方式發佈服務,若是clientaccesspolicy.xml放在D:\test\AA是沒有用的,
請務必將.xml放在IIS目錄下!就一般情況放在C:\Inetpub\wwwroot即可!


btw存取ESRI之Map Service也一樣,將.xml放在C:\Inetpub\wwwroot即可!

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繼續補齊服務部署

部署您的WCF服務

承前文建立您的第一個WCF服務(跟著PluralSight的Aaron Skonnard一起作)建立您的第一個WCF服務(跟著piggy一起作),我們已成功建立WCF,接下來要host到IIS上作為後續使用!

piggy該篇重點在展現WCF主要步驟,大部分採用微軟預設的內容,沒有著墨「編輯WCF組態」的步驟,很多需要手動編輯的地方也無須更改,為了完整瞭解部署過程,本文將承接Aaron Skonnard說明發佈至IIS的完整流程。
  1. 對方案right click加入新網站

  2. 把新網站預設提供的IService.vb與Service.vb刪除
    因為我們已經在前文實作服務了~不需要這些東西!(這2個檔案在網站的App_Code資料夾裡)

  3. 對網站right click選擇加入參考
    加入後BIn資料夾會多出前文建立之服務的DLL檔案


  4. 要在網站中host我們的服務,要先configure svc檔案(這邊我把Service.svc改成eval.svc)
    原始碼:<%@ ServiceHost Language="VB" Debug="true" Service="Service" CodeBehind="~/App_Code/Service.vb" %>
    修改後:<%@ ServiceHost Language="VB" Debug="true" Service="EvalServiceLibrary.EvalServiceLibrary.EvalService" %>
    上面的修改是告訴網站我們的服務在哪,並且把不必要的CodeBehind刪除,因為我們的服務已經在前文實作了!

  5. 對網站的web.config right click編輯WCF組態
    將服務的Name指向自建的Eval服務(請指向新網站Bin資料夾內的dll)

    更改端點,將wsHttpBinding的Contract重新指向服務


    新增端點,Address給予basic同上一樣重新指向服務
  6. 刪除web.config中不需要的部分
    從< configSections >.....到< / system.webServer >都刪掉!

  7. eval.svc right click選「在瀏覽器中檢視」

    那要怎麼測試呢?
    可以利用「Visual Studio 2008 命令提示字元」,輸入wcftestclient 加上前圖的完整服務網址(以本文為例是http://localhost:2230/EvalServiceSite/eval.svc),將會自動開啟WCF測試用戶端視窗提供您測試!
    Visual Studio 2008 命令提示字元
    WCF測試用戶端

  8. 至IIS建立名為evalservicesite的虛擬目錄,並將路徑指向新網站的根目錄
  9. 在IIS中對eval.svc right click選擇瀏覽,瀏覽器將會開啟一個和第7步驟一樣的服務
    這邊特別注意的是,步驟7是以http://localhost:2230/EvalServiceSite/eval.svc有包含port的方式開啟,本步驟的http://localhost/EvalServiceSite/eval.svc已經不用port了!因為他確實是部署到本機的IIS上!!


  10. 同步驟6使用Visual Studio 2008 命令提示字元,開啟WCF測試用戶端視窗提供您測試!
搞定收工!

在Silverlight中透過WCF&LINQ使用SQL

針對Silverlight開發者常遇到binding SQL應用,提出循序漸進的範例,其中包含WCF與LING這兩種技巧,原文請參考Displaying SQL Database Data in a DataGrid using LINQ and WCF,本文步驟title依照原文,除了不同處會額外說明,步驟內容只提供操作方式的中文,需瞭解更詳細說明與操作意義者請參考原出處。
  1. Getting Started
    新增一Silverlight專案,命名為SqlData,為了後續使用WCF,我們需要Silverlight Project和Server Project,專案類型請選ASP.NET Web應用程式專案(ASP.NET Web Application Project)



  2. Examining the Two Projects
    VS2008會在名為SqlData的方案下為您新增2個project


    您的SQLDataTestPage.aspx將會自動以ScriptManager裝載未來的xaml以進行測試,如下圖。如果像piggy一樣已安裝Silverlight 3 Tool for VS2008的朋友,你的*.aspx會長的和*.html一樣,這邊不用擔心~只是描述的方式不同罷了,您還是可以改成以前Silverlight 2預設的裝載模式(使用ScriptManager)。可參考本狀況的詳細描述


  3. Linq To Sql
    對Server Project(SqlData.Web)按右鍵加入新項目,選擇「LINQ to SQL類別」


  4. 打開伺服器總管(Server Explorer)找到資料庫AdventureWorks    

    將Customers資料表直接拖曳到DataClasses1.dbml頁面




  5. Make the resulting LINQ class Serializable
    滑鼠左鍵在DataClasses1.dbml空白處按一下,接著至右側屬性視窗更改序列化模式(Serialization Mode),將無(None)改為單向(Unidirectional)


  6. Create the Web Service
    對SqlData.Web按右鍵加入新項目,選擇「有Silverlight功能的WCF服務」,此時專案終獲多2個新檔案Service1.svc以及Service1.svc.vb


    下預設的DoWork方法改成我們設計的新方法,新方法將利用TerritoryID取回該客戶的所有資料,新方法的完整代碼如下
        Function GetCustomersByTerritoryID(ByVal territoryId As Integer) As List(Of Customer)
            Dim db As New DataClasses1DataContext
            Dim matchingCustomers = From cust In db.Customer _
                                    Where cust.TerritoryID.Equals(territoryId) _
                                    Select cust
            Return matchingCustomers.ToList()
        End Function

  7. LINQ Syntax
    不瞭解何謂LINQ者請參照原文p11或其他更深入的書籍

  8. Watch Out for the Binding!(超重要)
    WCF在web.config預設binding是使用wsHttpBinding
    < services >
    < service behaviorConfiguration="SqlData.Web.Service1Behavior"
                    name="SqlData.Web.Service1" >
          < endpoint address="" binding="customBinding" bindingConfiguration="customBinding0" contract="SqlData.Web.Service1" />
          < endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    < /service >
    < /services >

    但是Silverlight只支援basic binding (例如SOAP 1.1),,需要手動更改binging!
    < services >
    < service behaviorConfiguration="SqlData.Web.Service1Behavior"
                    name="SqlData.Web.Service1">
          < endpoint address="" binding="basicHttpBinding" contract="SqlData.Web.Service1" />
          < endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    < /service >
    < /services >

    OK!我們的服務已經架設好勒!

  9. Creating the Silverlight Application
    對Silverlight Application(SqlData)的參考按右鍵,選擇「加入服務參考」


    加入服務參考視窗出現後,按下搜尋(Discover)並選擇「方案中的服務」,我們新建的服務將會被找到,服務中的GetCustomersByTerritoryID也可以一併察看。


    選擇Service1按下確定,之後就可以透過這個參考去存取服務。


  10. Creating the XAML
    接下來設計一個簡單的UI,包含2個row,第1個用來放使用者輸入的TerritoryID,第2個放查詢結果。首先配置容器Grid的layout,xaml碼如下

        < Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True">
            < Grid.RowDefinitions>
                < RowDefinition Height="10" />
                < RowDefinition Height="50" />
                < RowDefinition Height="*" />
                < RowDefinition Height="10" />
            < /Grid.RowDefinitions>
            < Grid.ColumnDefinitions>
                < ColumnDefinition Width="10" />
                < ColumnDefinition Width="*" />
                < ColumnDefinition Width="10" />
            < /Grid.ColumnDefinitions>
        < /Grid>

    使用Expression Blend 3開啟xaml將會看到下圖成果,總共有3個row、2個column,邊邊都是為了版面故意規劃的row&column,主要是下圖2個大塊的row,如果用VS2008設計檢視看不到或看到的layout很怪的話,請用Blend 3來make sure



  11. Placing controls in the top row
    在第1個row準備放入3個控制項—Textblock、TextBox、Button,為了快速配置3個控制項於row1,我們採用stack panel,然後用border來框住這個範圍

    < Border BorderBrush="Black" BorderThickness="2" Grid.Row="1" Grid.Column="1"/>
    < StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal">
    < TextBlock Text="Last name to search for: " VerticalAlignment="Bottom" FontSize="18" Margin="15,0,0,0" />
        < TextBox x:Name="LastName" Width="250" Height="30" Margin="2,0,0,4" VerticalAlignment="Bottom"/>
        < Button x:Name="Search" Width="75" Height="30" Margin="20,0,0,4" Content="Search" VerticalAlignment="Bottom" Background="Blue" FontWeight="Bold" FontSize="14" />
    < /StackPanel>


    在第2個大塊的row放一個DataGrid

    < data:DataGrid x:Name="theDataGrid_" Margin="40,15" Grid.Column="1" Grid.Row="2" Width="700" Height="500" d:LayoutOverrides="GridBox"/>

    介面設計完成!

  12. Write the Event Handler for the Search Button
    我們希望UI中的Button被按下去之後會執行查詢的動作(搜尋和Text Box具有相同TerritoryID的顧客),所以要開始在*.xaml.vb撰寫程式碼

    Private Sub Page_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            AddHandler Search.Click, AddressOf Search_Click
    End Sub

    'Write the Event Handler for the Search Button
    Private Sub Search_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim webService As ServiceReference1.Service1Client = New ServiceReference1.Service1Client()
       AddHandler webService.GetCustomersByTerritoryIDCompleted, AddressOf webService_GetCustomersByTerritoryIDCompleted
       '注意:從Silverlight呼叫服務只能用非同步(Asynchronously)的方式
        webService.GetCustomersByTerritoryIDAsync(TerritoryID.Text)
    End Sub

    Private Sub webService_GetCustomersByTerritoryIDCompleted(ByVal sender As Object, ByVal e As SqlData.ServiceReference1.GetCustomersByTerritoryIDCompletedEventArgs)
    theDataGrid.ItemsSource = e.Result
    End Sub

    當然是件處理常式撰寫完畢後,要記得指派給Button,所以請在其屬性加上Click="Search_Click"

  13. 測試
    build成功後,輸入3搜尋(TerritoryID是Integer型別),可即刻取得ID為3的顧客資料。


    ★參考網址
    原出處
    下載AdventureWork資料庫
    本文使用的AdventureWork資料庫(搭配SQL Server Express 2005)

建立您的第一個WCF服務(跟著piggy一起作)

寫在前面:相較於前文piggy在本文將提供最精簡的步驟,盡量保持專案初始的配置(例如直接使用WCF專案預設提供的Service.vb和IService.vb檔案)

情境描述:建立一個簡單的服務,服務提供的資料具備3種屬性,而服務提供的方法則有遞交、取得、刪除3種方法。
a)屬性命名:Id、Sumbitter、Comments
b)方法命名:SubmitEval、GetEvals、RemoveEval

1.新增專案

建立名為EvalServiceLibrary2的WCF服務程式庫


專案的預設配置

2.定義服務(本步驟在IService1.vb進行)
a)ServiceContract
將預設的2個方法刪除(GetData、GetDataUsingDataContract),加入我們設計的3種方法(SubmitEval、GetEvals、RemoveEval)

 原始ServiceContract


加入3個新方法的ServiceContract

上圖的Eval型別錯誤不用擔心,那是因為我們還沒規範出自定義的Eval型別!
步驟a已完成服務的method,接下來我們要定義DataContract,明確規範自定義的Eval型別!
b)DataContract

原始DataContract


在DataContract規範自定義之Eval Class

3.實作服務(本步驟在Service1.vb進行)
將預設2個方法的實作部分刪除,利用IntelliSense在Implements IService1後面按下Enter,VS2008將自動加入需要實作的code片段,這些片段是根據步驟2我們定義的3種方法所產生。

 原始Service1.vb


根據步驟2 Contract自動產生的新Service1.vb

繼續撰寫3個方法(IntelliSense自動產生的)的內容,完成實作的部分,此時錯誤清單已經沒有任何錯誤!WCF服務已建置成功!

實作內容

3.F5進行測試(測試請參考前一篇步驟14&15)

4.存檔

建立您的第一個WCF服務(跟著PluralSight的Aaron Skonnard一起作)

1.開啟VSTS2008,專案→新增專案→WCF→WCF服務程式庫→輸入名稱EvalServiceLibrary

2.刪除預設的IService1.vb與Service1.vb

3.對專案EvalServiceLibrary按右鍵→加入→類別→輸入名稱Eval

4.在Eval.vb輸入程式碼
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Runtime.Serialization

Namespace EvalServiceLibrary
    < DataContract() > _
    Public Class Eval
        < DataMember() > _
        Public Id As String
        < DataMember() > _
        Public Submitter As String
        < DataMember() > _
        Public Comments As String
    End Class
End Namespace


5.同步驟3再新增1個類別IEvalService.vb,貼上程式碼如下
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.Runtime.Serialization

Namespace EvalServiceLibrary
        < ServiceContract() > _
    Public Interface IEvalService
        < OperationContract() > _
        Sub SubmitEval(ByVal eval As Eval)
       
< OperationContract() > _
        Function GetEvals() As List(Of Eval)
       
< OperationContract() > _
        Sub RemoveEval(ByVal id As String)
    End Interface
End Namespace
 

 6.再次新增新類別EvalService.vb並輸入下列程式碼
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text

Namespace EvalServiceLibrary
    Public Class EvalService
    End Class
End Namespace

7.在 Public Class EvalService後面輸入:Implements .NET 的IntelliSense會自動出現各種namespace供你選取,選擇IEvalService後頁面會自動放置你需要實做的各類Interface,也就是步驟5我們所設計的3種[OperationContract]


8. 承前,在Public Class EvalService : Implements IEvalService前輸入
完整程式碼如下highlight
Namespace EvalServiceLibrary
    < ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single) > _
    Public Class EvalService : Implements IEvalService

9.把EvalService.vb的三個method完成後進行偵錯,完整程式碼如下highlight
Public Class EvalService : Implements IEvalService

        Dim evals As New List(Of Eval)()
        Public Function GetEvals() As System.Collections.Generic.List(Of Eval) Implements IEvalService.GetEvals
            Return evals
        End Function

        Public Sub RemoveEval(ByVal id As String) Implements IEvalService.RemoveEval
            evals.Remove(evals.Find(Function(e) e.Id.Equals(id)))
        End Sub

        Public Sub SubmitEval(ByVal eval As Eval) Implements IEvalService.SubmitEval
            eval.Id = Guid.NewGuid().ToString
            evals.Add(eval)
        End Sub
    End Class

10.對App.config按右鍵選擇「編輯WCF組態」


11.點選服務EvalServiceLibrary.Service1,右方視窗出現服務的一般屬性

12.承上繼續修改Name屬性,瀏覽至方案資料夾下的bin\Debug\EvalServiceLibrary.dll,指向型別名稱EvalServiceLibrary.EvalServiceLibrary.EvalService的服務類型

13. 在左側視窗展開服務的端點(endpoint),開始修改端點內容的Contract屬性,一樣瀏覽至bin\Debug\EvalServiceLibrary.dll,指向型別名稱EvalServiceLibrary.EvalServiceLibrary.IEvalService的合約類型

第2個端點則不用修改,回到最上層的服務觀看所有服務端點,可以發現第2個的Contract是「IMetadataExchange」,它是負責runtime時取回服務的metadata

14.存檔後按下F5,出現「WCF測試用戶端」視窗

同時Windows工具列右下方會出現1個可愛的WCF服務主機icon,滑鼠double-click開啟WCF服務主機可以察看服務的address等metadata

15.開始透過WCF測試用戶端進行測試
a)SubmitEval測試
  • double-click視窗左側的SubmitEval,於右方開啟測試窗格
  • 在Comment與Submitter輸入任意字串
  • 按下叫用(Invoke)完成測試
  • 重複上述步驟做3次測試
b)GetEvals測試
  • double-click視窗左側的GetEval,於右方開啟測試窗格
  • 按下叫用 ,可以看到SumbitEval送出的3筆資料
c)RemoveEval測試
  • 挑選GetEval中列出的其中一筆資料,複製其Id
  • double-click視窗左側的RemoveEval,於右方開啟測試窗格
  • 將複製的Id貼入進行測試(貼入前記得移掉雙引號)
  • 按下叫用,完成測試
  • 再回去GetEvals並重新叫用,發現被移除1筆資料,只剩下2筆
16.結束

★本篇依據Windows Communication Foundation 初學者指南第一段影片實做,重點是提供詳細中文步驟,嫌步驟太繁雜or想知道操作意義者,請參考piggy精簡後的建立您的第一個WCF服務(跟著piggy一起作)