WCF服務配置是WCF服務編程的主要部分。WCF作為分布式開發的基礎框架,在定義服務以及定義消費服務的客戶端時,都使用了配置文件的方法。雖然WCF也提供硬編程的方式,通過在代碼中直接設置相關對象的屬性來完成服務端與客戶端的配置,然而這種方式並不利於后期程序的更改和擴展。因此,配置文件給WCF程序編程帶來了極大的便利性,通過配置文件配置服務,可提供在部署時而非設計時提供終節點和服務行為數據的靈活性。正因如此,WCF的框架有着極大的伸縮性和自定義性。
WCF配置文件的結構如下圖所示,包含3個部分,services(服務)、bindings(綁定)、behaviors(行為)
1.services節點
每個服務的發布都會包含有一個service節點,里面包含一個或者多個endpoint(終結點)。Service元素具有如下屬性:
- name:指定提供服務協定實現的類型,它是完全限定名稱(命名空間和類型名稱)
- behaviorConfiguration:指定在behaviors元素中找到的服務行為元素的名稱,對應的behaviors里面的節點為serviceBehaviors節點
endpoint指定用於公開服務的服務終結點的綁定、協定和地址屬性。與WCF的所有通信是通過該服務的終結點進行的,利用終結點,WCF服務可以訪問WCF提供的功能。常用屬性如下:
- address: 一個包含終結點地址的字符串,指定服務元素的統一標識符(URI)。 可以將地址指定為絕對地址或相對地址。 如果提供的是相對地址,則需要主機提供適合於綁定中所使用的傳輸方案的基址。 如果未配置地址,則假定基址為該終結點的地址。默認值為一個空字符串。
- binding: 綁定指定如何與終結點進行通信,它可以是系統提供的綁定類型,如wsHttpBinding、WSDualHttpBinding、NetTcpBinding等,也可以是用戶自定義綁定類型。指定的綁定確定傳輸協議的類型、安全和使用編碼,以及是否支持或啟用可靠會話、事務或流。
- bindingConfiguration:一個字符串,指定實例化終結點時所使用的綁定的綁定名稱。 定義終結點時,綁定名稱必須在作用域內。如上圖中采用的是wsHttpBinding,則bindingConfiguration的名稱對應bindings下的wsHttpBinding里的名稱為binding1的綁定。
- behaviorConfiguration:指定在behaviors元素中找到的終結點行為元素的名稱,對應的behaviors里面的節點為endpointBehaviors節點.
- Contract:指示此終結點公開了哪個協定。 程序集必須實現該協定類型。 如果服務實現所實現的是單個協定類型,則可以省略此屬性。 默認值為一個空字符串。
元數據終結點:WCF服務通過發布一個的或者多個元數據終結點來發布元數據。發布元數據后可以通過標准協議(如WS-MetadataExchange(MEX)和Http/Get請求)來使用該元數據。元數據終結點類似於其他服務終結點,他們 都需要第一個地址、一個協定、一個綁定。若要啟用發布元數據終結點,必須將ServiceMetadataBehavior服務行為添加到該服務。默認情況下,WCF服務不發布元數據終結點,所以必須將他們顯示的添加到服務配置中才能為 服務啟用元數據發布。如下圖所示:
Note: WCF元數據相關概念
WCF服務元數據是什么?
WCF服務元數據是WCF服務的核心部分服務地址(Address)、綁定(通信協議Binding)、契約(服務、操作、數據Contract)的原始描述信息。服務所公開的元數據包括 XSD(文檔中出現的元素、文檔中出現的屬性、子元素、子元素的數量、子元素的順序、元素是否為空、元素和屬性的數據類型、元素或屬性的默認和固定值)和 WSDL 文檔(用於描述服務的方法、參數、參數個數、順序、返回值、返回值的類型等方法的相關信息)。.Disco文檔(描述服務的協議、地址、命名空間等信息)。
這些關鍵的WCF服務元數據全部都是基於XML語言描述,支持核心的行業標准協議。XSD好處顯而易見, 基於XML,沒有專門的語法 ,XML Schema支持一系列的數據類型(int、float、Boolean、date等) ,可擴充的數據模型,支持綜合命名空間 ,支持屬性組等。而這些正式WCF分布式服務追求的跨語言、跨平台的關鍵部分所在。
為什么要暴露服務元數據?
知道了WCF服務元數據的概念后,我們就能理解為什么要暴露服務的元數據。WCF服務的元數據描述服務的核心信息,客戶端需要了解這些特征以便與該服務進行通信。要想實現異構平台或者系統之間的通信,以前的技術是使用Web Service.因為其具有自描述、可擴展、與平台無關等優勢。客戶端只需要根據Web Service地址,便可獲取服務的相關信息,反序列話本地的代碼,通過服務代理進行服務的調用。
WCF服務主要特性之一就是跨平台的服務交互。而暴露服務元數據的重要原因就是解決了異構客戶端服務交互的關鍵問題。 元數據基於XML,自描述。客戶端可以根據服務的元數據反序列換生成本地代碼,無論是c#,vb還是java語。
2.bindings節點
配置綁定所需要的節點屬性,綁定用於連接WCF服務終結點所需要的詳細信息,所以每個終結點必須正確配置綁定信息,綁定最起碼需要指定使用的傳輸機制(HTTP/TCP),還可以設置其他特征,如安全和事務支持。綁定信息可能很復雜,也可能很簡單,一般來說綁定包含的如何連接到終結點的信息屬於以下類別中的一種。
- 協議:確定使用的安全機制,可靠消息傳遞或事務上下文流設置
- 編碼:確定消息編碼(如文本或二進制)
- 傳輸:確定使用的基礎傳輸協議(如TCP/HTTP)
3.behaviors節點
包含serviceBehaviors(服務行為)、endpointBehaviors(終結點行為)的配置。
- serviceBehaviors:包含的子元素如下:
- endpointBehaviors:包含的子元素如下:
Note:具體參照MSDN
https://msdn.microsoft.com/zh-cn/library/aa967282(v=vs.110).aspx
https://msdn.microsoft.com/zh-cn/library/vstudio/ms731403(v=vs.100).aspx
接下來,我們照常寫個實例,實例很簡單,工程結構如右圖所示:
using System.ServiceModel; namespace Service { [ServiceContract] public interface IReqReply { [OperationContract] string SayHello(string name); } }
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Service { public class ReqReply:IReqReply { public string SayHello(string name) { return "Hello "+name; } } }
|
![]() |
Host工程的App.config配置文件如下:
<?xml version="1.0"?> <configuration> <system.serviceModel> <services> <service name="Service.ReqReply" behaviorConfiguration="ReqReplyBehavior"> <host> <baseAddresses> <add baseAddress="http://127.0.0.1:1234/ReqReply/"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding" contract="Service.IReqReply" bindingConfiguration="binding1" behaviorConfiguration="behavior1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <bindings> <wsHttpBinding> <binding name="binding1"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="ReqReplyBehavior"> <serviceMetadata httpGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="True"/> </behavior> </serviceBehaviors> <endpointBehaviors> <behavior name="behavior1"> <dataContractSerializer maxItemsInObjectGraph="2147483647"/> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel> </configuration>
寄宿服務,Program.cs的代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using Service; namespace Host { class Program { static void Main(string[] args) { using (ServiceHost ReqReplyHost = new ServiceHost(typeof(ReqReply))) { ReqReplyHost.Opened += delegate { Console.WriteLine("請求響應通訊服務已經啟動,按任意鍵終止!"); }; ReqReplyHost.Open(); Console.Read(); } } } }
引用服務http://127.0.0.1:1234/ReqReply/,將服務命名為:ReqReplyServiceRef,客戶端調用代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Client.ReqReplyServiceRef; namespace Client { class Program { static void Main(string[] args) { ReqReplyClient proxy = new ReqReplyClient(); Console.WriteLine(proxy.SayHello("WCF")); Console.Read(); } } }