1. 程式人生 > >WCF學習(二)建立簡單的服務和客戶端

WCF學習(二)建立簡單的服務和客戶端

下面是建立服務和客戶端的步驟:

(1)建立服務和資料協定;

(2)使用EF建立訪問資料庫的庫檔案;

(3)實現服務;

(4)使用WCF服務宿主(Service Host)和WCF測試客戶端(Test Client);

(5)建立定製的服務宿主;

(6)使用元資料建立客戶端應用程式;

(7)使用共享的協定建立客戶端應用程式;

(8)配置診斷設定。

2.1定義服務和資料協定

定義資料類,這個類定義資料庫中需要的資料,並在網路中傳送。要通過WCF服務傳送資料,應該在該類附加DataContract和DataMember屬性。System.ComponentModel.DataAnnotation名稱空間中的Stringlength屬性不僅可以用於使用者輸入驗證,還可以在建立資料表時定義列的模式。

接著建立服務協定,服務提供的操作可以通過介面來定義。服務協定用ServiceContract屬性定義。由服務提供的操作應用了OperationContract屬性。

2.2資料訪問

定義服務介面實際的操作,操作資料庫讀寫資料。

2.3服務的實現

現在開始實現服務。建立一個WCF服務庫RoomReservationService。這個庫預設包含服務協定和服務實現。如果客戶端應用只使用元資料資訊來建立訪問服務的代理,這個模型就是可以用的。但是,如果客戶端可能直接使用協定型別,則最好協定放在一個獨立的程式集中,如本例所示。在第一個已完成的客戶端吧中,代理是從元資料中建立的。以後將介紹如何建立客戶端,來共享協定程式。把協定和實現分開,是共享協定的一個準備工作。

2.4WCF服務宿主和WCF測試客戶端

WCFServiceLibrary專案模板建立了一個應用程式配置檔案App.config,它需要適用於新類名和新介面名。service元素引用了包含名稱空間的服務型別,協定介面需要用endpoint元素定義。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="Wrox.ProCSharp.WCF.Service.RoomReservationService">
        <endpoint address="" binding="basicHttpBinding" contract="Wrox.ProCSharp.WCF.Contracts.IRoomService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/RoomReservationService/Service1/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1"/></startup></configuration>

從vs2013中啟動這個庫,會啟動WCF服務宿主,它顯示為工作列的注意區域中的一個圖示。單擊這個圖示會開啟WCF服務宿主視窗。在其中可以檢視服務的狀態。WCF庫應用程式的專案屬性包含WCF選項卡,在其中可以選擇運行同一個解決方案中的專案時,是否啟動WCF服務宿主。預設開啟這個選項。另外在專案屬性的除錯配置中,會發現已定義命令列引數/client:WcfTestClient.exe。WCF服務主機使用這個選項,會啟動WCF測試客戶端,該測試客戶端可用於測試應用程式。雙擊一個操作,輸入欄位就會顯示在應以程式的右邊,可以再其中填充要傳送給伺服器的資料。單擊XML選項卡,可以看到已收發的SOAP訊息。

使用WCF可以再任意宿主上執行服務。可以為對等服務建立一個Windows窗體或WPF應用程式,或建立一個Windows服務,或用Windows Activation ServiceWAS或IIS存放該服務。控制檯應用程式也適用於演示簡單的主機。

對於服務主機,必須引用服務庫和System.ServiceModel程式集。該服務首先例項化和開啟ServiveHost型別物件。這個類在System.ServiceModel名稱空間中定義。實現該服務的RoomReservcationService類在建構函式中定義。呼叫Open方法會啟動服務的監聽通道,該服務準備用於偵聽請求。close()方法會停止通道。下面的程式碼段還添加了ServiceMetadataBehavior型別的一個操作,新增該操作,就允許使用WSDL建立一個客戶端應用程式。

2.8與客戶端共享協定程式集

在前面的WPF客戶端應用程式中,使用元資料建立了一個代理類,用vs添加了一個服務引用。客戶端也可以用共享的協定程式集來建立,如夏所示。使用協定介面和ChannelFactory<TChannel>來例項化連線到服務上的通道。

類ChannelFactory<TChannel>的建構函式接受繫結配置和端點地址作為引數。繫結必須與服務宿主定義的繫結相容,用EndPointAddress類定義的地址引用了當前執行的服務的URI。CreateChannel方法建立了一個連線到服務上的通道,接著就可以呼叫服務的方法了。