WCF入門二[WCF的配置檔案]
一、概述
往往在很多專案中資料庫連線字串、變數和一些動態的載入類會寫在配置檔案中。WCF也會在配置檔案中寫入一些配置引數,比如服務的地址、服務用於傳送和接收訊息的傳輸和訊息編碼等,通過配置檔案可以靈活的修改,不需要再編譯。
二、終結點Endpoint
首先我們需要了解WCF的一個概念就是終結點Endpoint,WCF服務通過定義一個或者多個終結點,當服務端和客戶端的終結點相互匹配的時候才可以完成通訊。終結點Endpoint由三部分組成Address、Binding和Contract。
Address:直譯就是地址,相當於URL,通過地址可以訪問到WCF的服務。
Binding:直譯是繫結,繫結的是客戶端和服務端底層的細節,比如傳輸的時候使用什麼編碼格式xml、text、二進位制等。採用tcp還是http等等。
Contract:就是契約,規定我們那些服務介面可以訪問,那些不能訪問。暴露WCF服務的某些方法。
終結點的詳細配置內容就是寫在配置檔案中,用於WCF實現多個應用程式之間的通訊。
三、WCF配置檔案的組成
WCF的配置詳情都在<system.serviceModel>節點下,下面是配置檔案的示例,配置的節點有點多,這裡主要描述<services>、<bindings>和<behaviors>這三個。更加深入的內容可以詳見MSDN文件。
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.serviceModel> <behaviors> <!-- List of Behaviors --> </behaviors> <client> <!-- List of Endpoints --> </client> <diagnostics wmiProviderEnabled="false" performanceCountersEnabled="false" tracingEnabled="false"> </diagnostics> <serviceHostingEnvironment> <!-- List of entries --> </serviceHostingEnvironment> <comContracts> <!-- List of COM+ Contracts --> </comContracts> <services> <!-- List of Services --> </services> <bindings> <!-- List of Bindings --> </bindings> </system.serviceModel> </configuration>
1.<services>
該節點是必須有的,配置服務、介面和終結點。可以有多個service節點,每個service節點有name(服務的具體實現,格式應為 Namespace.Class.
)和behaviorConfiguration(一個字串,其中包含要用於例項化服務的行為(behavior)的行為名),並且可以在service節點下存在多個終結點<endpoint>。具體例項如下:
<services> <service name="WcfServiceLibrary1.Service1"> <host> <baseAddresses> <add baseAddress = "http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" /> </baseAddresses> </host> <!-- Service Endpoints --> <!-- 除非完全限定,否則地址將與上面提供的基址相關 --> <endpoint address="" binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1"> <!-- 部署時,應刪除或替換下列標識元素,以反映 用來執行所部署服務的標識。刪除之後,WCF 將 自動推斷相應標識。 --> <identity> <dns value="localhost"/> </identity> </endpoint> <!-- Metadata Endpoints --> <!-- 元資料交換終結點供相應的服務用於向客戶端做自我介紹。 --> <!-- 此終結點不使用安全繫結,應在部署前確保其安全或將其刪除--> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>
2.<bindings>
此節包含標準繫結和自定義繫結的集合。每一項都是一個可由其唯一 name 進行標識的 binding 元素。服務通過用 name 與繫結進行連結來使用繫結。繫結包含以下元素:
- 協議堆疊確定用於傳送到終結點的訊息的安全性、可靠性和上下文流設定。
- 傳輸確定將訊息傳送到終結點時使用的基礎傳輸協議,例如 TCP 或 HTTP。
- 編碼確定用於傳送到終結點的訊息的網路編碼,例如,文字/XML、二進位制或訊息傳輸優化機制 (MTOM)。
因為繫結的內容節點非常多,詳細的還是看詳細文件,這裡只舉一個例項:
<mexHttpBinding> <binding closeTimeout="TimeSpan" name="string" openTimeout="TimeSpan" receiveTimeout="TimeSpan" sendTimeout="TimeSpan"> </binding> </mexHttpBinding>
3.<behaviors>
此元素定義名為 endpointBehaviors 和 serviceBehaviors 的兩個子集合。每個集合分別定義終結點和服務所使用的行為元素。每個行為元素由其唯一的 name 特性標識。比如:是否允許客戶端獲得服務的元資料、路由修改、操作訪問許可權設定、服務的限制機制、服務請求的超時時間等。例項如下:
<behaviors> <serviceBehaviors> <behavior> <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/> <serviceDebug includeExceptionDetailInFaults="False" /> </behavior> </serviceBehaviors> </behaviors>
四、其他
新建一個WCF服務程式後會有一個Web.config檔案有<system.serviceModel>配置節點,當一個控制檯應用程式新增該服務引用後也會有App.config檔案中也會有<system.serviceModel>節點。我們知道當服務端和客戶端的終結點相互匹配的時候才可以完成通訊,但是現在我們把服務端Web.config的<system.serviceModel>節點內容全部刪除,然後將WCF應用服務程式釋出到IIS上,之後還是可以在客戶端成功訪問該服務。這是因為IIS在預設監聽http協議,那樣就可以確定檔案地址、繫結,找到了檔案那介面契約什麼的也都找得到了,所以這時候服務端配置檔案不需要<system.serviceModel>也可以。
五、說明
這個隨筆是我自己學習流程的一個記錄,和大家共勉。