1.服務端開發(包含寄宿) 1.1 WCF服務創建方式 創建一個WCF服務,總是會創建一個服務介面和一個服務介面實現。通常根據服務宿主的不同,有兩種創建方式。 (1)創建WCF應用程式 通過創建WCF服務應用程式,可生成一個帶.svc尾碼名的文件。該文件與webform中的aspx文件類似,有後置代 ...
1.服務端開發(包含寄宿)
1.1 WCF服務創建方式
創建一個WCF服務,總是會創建一個服務介面和一個服務介面實現。通常根據服務宿主的不同,有兩種創建方式。
(1)創建WCF應用程式
通過創建WCF服務應用程式,可生成一個帶.svc尾碼名的文件。該文件與webform中的aspx文件類似,有後置代碼,這些後置代碼是服務介面的實現。這種方式創建的WCF服務都承載在IIS或WAS上。
(2)創建WCF服務庫
WCF服務庫是一個類庫,如前所述包含一個服務介面和服務實現,此種方式創建的WCF服務可根據需要寄宿在windows客戶端、windows服務、控制台程式等宿主上。
1.2 WCF服務的協議
協定定義了服務端可以提供的功能和客戶端可以使用的功能,它獨立於服務實現代碼,可分為如下5種協定類型。
(1)數據協定
主要用於定義在服務端和客戶端之間傳輸的複雜數據類型。對複雜數據類型定義數據協定,主要適用於客戶端與服務端共用協定程式集的情況,而如果客戶端是添加引用的方式來創建服務代理,則未必要專門定義數據協定。數據協定的類用[DataContract]特性標記,其內部要序列化的屬性必須用[DataMember]特性標記。
註:webservice採用XML序列化,此種序列化只序列化公共欄位和屬性,因此如對複雜數據類型不特別定義數據協定,則會採用這種序列化方式。
(2)服務協定和操作協定
服務協定和操作協定是最重要的兩個協定,創建一個WCF服務肯定有這兩個協定。
服務協定用於定義描述了服務的WSDL,它通常為一個介面(也可以為一個類),用[ServiceContract]特性標明。操作協定在服務協定裡面,定義了服務的操作,並用[OperationContract]特性標明。
ServiceContract和OperationContract有幾個比較重要的屬性,如下
協 定 | 屬 性 | 描 述 |
ServiceContract | SessionMode | 定義該服務協定是否允許有會話,其值用SessionMode枚舉定義,包括Allowed、NotAllowed、Required。 |
OperationContract | IsOneWay | 是否單向操作,單向操作時,客戶端不會等待服務端的回應,一般可用於無返回值的操作。 |
IsInitiating | 當前操作是否啟動一個新會話。 | |
IsTerminating | 當前操作是否關閉會話。 |
(3)消息協定
可以指定傳輸的數據哪些是放在soap的標題中,哪些是在正文中。消息協定的數據類用[MessageContract]標明,類中放在soap標題和正文中的成員用[MessageHeader]和[MessageBodyMember]標明。
(4)錯誤協定
預設情況下,為了安全性,在服務端出現的錯誤不返回客戶端,但也可以把包含有用信息的錯誤返回給調用者。若要將錯誤返回客戶端,可在webConfig中將serviceDebug小節的includeExceptionDetailInFaults屬性設為true。強類型化的soap錯誤協定可以用數據協定定義,併在相應操作協定中用[FaultContract]特性標明,併在該特性的屬性中標明錯誤的類型。
1.3 WCF服務宿主
WCF的服務宿主比較豐富,可以是WAS(Windows Activation Service,Windows激活服務)、IIS、Windows應用程式、Windows服務、控制台應用程式等。
在創建WCF服務時,若創建的是WCF應用程式,則其服務尾碼名帶.svc,其宿主為IIS或WAS。若創建的是WCF服務庫,則其通過實例化ServiceHost,並調用其對象的open()方法,可以寄宿在任意宿主上,且其相關綁定、端點等配置可以用寫代碼實現(給ServiceHost對象屬性賦值),而不必在webConfig中進行配置()。
1.4 WCF服務的服務端配置文件
WCF服務端和客戶端的配置都可以在其應用程式配置文件的“system.serviceModel”小節。該小節下的配置項主要由bindings、behaviors和services,其中bindings和behaviors是為services小節服務的。
(1)bindings
bindings小節用來定義綁定,所定義的綁定可添加到service的endpoint小節的bindingConfiguration屬性中。當然,該節也可以直接去掉,因為.net預定義了一些綁定,所以endpoint小節中直接使用這些預定義的綁定就可以了。
(2)behaviors
behaviors小節可定義客戶端是否允許通過添加引用獲取元數據,服務端報錯時,客戶端是否也允許看到報錯等。
(3)services
services小節定義了所提供的服務,其下可以有多個service,每個service下主要有兩個子節點:host和endpoint。host可定義服務的基地址,且如果服務要支持多種傳輸協議的話,也可以有多個基地址。服務端點需要配置服務的相對地址、綁定和服務協定(如果定義了特殊的綁定和行為,則還需將這些特殊的綁定和行為加進來)。而如果服務是自宿主的話,還需另加一個mex端點,用來客戶端獲取元數據。
*Wcf的配置,除了手動在應用程式的配置文件里配置外,VS還專門提供了一個可視化工具(WCF服務配置編輯器,在工具菜單下)來進行配置。
2.客戶端開發
2.1 客戶端引用
客戶端通過生成WCF服務的代理,來調用服務所提供的一些方法。客戶端生成代理的方式有兩種:
(1)通過獲取wsdl生成代理類:客戶端通過vs添加引用,去訪問服務端的WSDL文檔,並生成一個代理類。
(2)通過共用協定程式集生成代理:客戶端引用服務協定的程式集,通過使用ChanelFactory<TChanel>類寫代碼來生成服務代理,從而調用服務的方法。ChanelFactory<TChanel>類的構造函數需要傳綁定信息和端點地址來進行實例化並創建通道,服務用完後,其對象還要調用close()方法關閉通道。
2.2 客戶端配置
客戶端需配置一個與服務端保持一致的端點(在client小節下),端點中需配置的屬性包括服務地址、服務綁定、服務協定等。