配置服務概述
在設計和實現服務協定后,即可配置服務。在其中可以定義和自定義如何向客戶端公開服務,包括指定可以找到服務的地址、服務用於發送和接收消息的傳輸和消息編碼,以及服務需要的安全類型。
配置服務的類型
--使用配置文件配置
--在代碼中強制配置
實際上,編寫配置是WCF應用程序編程的主要部分。
使用配置文件配置WCF服務
--通過使用配置文件配置Windows Communication Foundation(WCF)服務,可提供在部署時而設計時提供終結點和服務行為數據的靈活性。
--可使用.NET Framework配置技術對WCF服務進行配置。通常情況下,向承載WCF服務的Intrnet信息服務(IIS)網站的Web.config文件添加XML元素。通過這些元素,可以逐台計算機更改詳細信息,例如終結點地址(用於與服務進行通信的實際地址)。此外,WCF包括幾個系統提供的元素,可用於快速選擇服務的最基本的功能
--WCF使用.NET Framework的System.Configuration配置系統
1.使用IIS來承載服務-使用Web.config文件
2.使用任何其他宿主環境-使用App.config文件指定設置。
Service元素
每個服務都具有以下屬性:
--name,指定聽歌服務協定的實現的類型。這是完全限定名稱(命名空間和類型名稱)。
--behaviorConfiguration.指定一個在behabiors元素中找到的behabior元素的名稱,指定的行為控制操作,例如服務是否允許模擬。
endpoint元素
每個終結點都需要以下屬性表示的地址、綁定和協定:
--address.指定服務的統一資源標識符(URI),它可以是一個絕對地址,或是一個相對於服務基址給定的地址。如果設置為空字符串,則指示在創建服務的ServiceHost時,終結點在指定的基址上可用。
--binding.通常,指定一個類似WsHttpBinding的系統提供的綁定,但也可以指定一個用戶定義的綁定,指定的綁定確定傳輸協議類型、安全和使用的編碼,以及是否支持或啟用可靠會話、事務或流。
--bindingConfiguration。如果必須修改綁定的默認值,則可通過在bindings元素中配置相應的binding元素來執行此操作。次屬性應賦予與用於更改默認值的binding元素的name屬性相同的值。
--contract.指定定義協定的接口。這是在由Service元素的name屬性指定的公共語言運行庫(CLR)類型中實現的接口。
配置綁定
綁定是用於指定連接到Windows Communication Foundation(WCF)服務終結點所必需的通信詳細信息的對象。WCF服務中的每個終結點都要求正確指定綁定。
綁定最起碼必須指定要使用的傳輸(如Http或TCP)。還可以通過綁定來設置其他特征,如安全和事務支持。
綁定中的信息可能非常基本,也可能非常復雜。最基本的綁定僅指定必須用於連接到終結點的傳輸協議(如Http).一般來說,綁定包括的有關如何連接到終結點的信息屬於以下類別中的一種。
--協議
確定要是用的安全機制,可靠消息傳遞功能或事務上下文流設置。
--編碼
確定消息編碼(例如,文本或二進制)。
--傳輸
確定要使用的基礎傳輸協議(例如,TCP或HTTP)。
綁定中的信息可能十分復雜,而且某些設置可能與其他設置不兼容。因此,WCF包含一組系統提供的綁定。這些綁定旨在滿足大多數應用程序要求。下面的類表示系統提供的綁定的一些示例:
--BasicHttpBinding:一個HTTP協議綁定,適用於連接到復合WS-1既不能配置文件規范的Web服務(例如,基於ASP.NET Web服務的服務)。
--WSHttpBinding:一個可互操作的綁定,適用於連接到復合WS_*協議的終結點。
--NetNamePipeBinding:使用.NET.FrameWork連接到同一計算機上的其他WCF終結點。
--NetMsmqBinding:使用.NET Framework創建與其他WCF終結點的排隊消息連接。
使用自己的綁定
--如果系統提供的綁定都不具有服務應用程序所需要的正確功能組合,則可以創建自己的綁定,有兩種方法可以實現此目的。
--可以勇士CustomBinding對象從預先存在的綁定元素創建新的綁定
--也可以通過從Binding綁定派生來創建完全由用戶定義的綁定
使用綁定
--使用綁定需要執行兩個基本步驟:
--選擇和定義綁定.最簡單的方法就是選擇WCF包含的系統提供綁定中的一個,並且通過該綁定的默認設置來使用它。。
--創建一個使用所選擇或定義的綁定的終結點。
主要就是在System.ServiceModel節點下的四個節點 Services bindings behaviors client
再來看一下bindings節點下的
接下來看behaviors節點下的
再來看一下client節點下的
最后我們來看一下Services節點下的
Services節點下可以有一個或多個Service節點。再來看一下Service節點下的
最最后將總的配置文件全部載入
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!-- <system.ServiceModel> section --> <system.ServiceModel> <!-- services 元素包含應用中駐留的所有service的配置要求 --> <services> <!-- 每個服務的配置 屬性說明: name - 指定這個service配置是針對的那個服務,為一個實現了某些Contract的服務類的完全限定名 (名稱空間.類型名),ServiceHost載入一個服務后,會到配置文件中的<services>下找有沒有 name屬性跟服務匹配的<service>的配置 behaviorConfiguration - 指定在<serviceBehaviors>下的一個<behavior>的name,這個特定<behavior> 給這個service制定了一些行為,比如服務是否允許身份模擬--> <service name="名稱空間.類型名" behaviorConfiguration="behavior名"> <!-- 每個服務可以有多個Endpoint,下面<endpoint>元素對每個Endpoint分別進行配置 屬性說明: address - 指定這個Endpoint對外的URI,這個URI可以是個絕對地址,也可以是個相對於baseAddress的 相對地址。如果此屬性為空,則這個Endpoint的地址就是baseAddress binding - 指定這個Endpoint使用的binding,這個banding可以是系統預定義的9個binding之一, 比如是basicHttpBinding,也可以是自定義的customBinding。binding決定了通訊的類型、 安全、如何編碼、是否基於session、是否基於事務等等 contract - 指定這個Endpoint對應的Contract的全限定名(名稱空間.類型名),這個Contract應該被 service元素的name指定的那個service實現 bindingConfiguration - 指定一個binding的配置名稱,跟<bindings>下面同類<binding>的name匹配 name - Endpoint的名稱,可選屬性,每個Contract都可以有多個Endpoint,但是每個Contract對應的 多個Endpoint名必須是唯一的--> <endpoint address="URI" binding="basicHttpBinding" contract="Contract全限定名" bindingConfiguration="binding名" name=""> <!-- 用戶定義的xml元素集合,一般用作SOAP的header內容--> <headers> <!-- 任何xml內容 --> </headers> <identity> <!-- <identity>下的元素都是可選的--> <userPrincipalName></userPrincipalName> <servicePrincipalName></servicePrincipalName> <dns></dns> <rsa></rsa> <certificate encodedValue=""></certificate> <!-- <certificateReference>的屬性都是可選的 屬性說明: storeName - 證書的存儲區,可能值為:AddressBook,AuthRoot,CertificateAuthority Disallowed,My,Root,TrustedPeople,TrustedPublisher storeLocation - 證書存儲位置,可能值為:CurrentUser,LocalMachine--> <certificateReference storeName="" storeLocation=""> </certificateReference> </identity> </endpoint> <host> <baseAddresses> <!-- 在此可以定義每種傳輸協議的baseAddress,用於跟使用同樣傳輸協議Endpoint定義的相對地 址組成完整的地址,但是每種傳輸協議只能定義一個baseAddress。HTTP的baseAddress同時是service 對外發布元數據的URL--> <add baseAddress="http://address" /> </baseAddresses> <timeouts></timeouts> </host> </service> </services> <!-- 指定一個或多個系統預定義的binding --> <bindings> <!-- 指定一個或多個系統預定義的binding,比如<basicHttpBinding>,當然也可以指定自定義的customBinding, 然后在某個指定的binding下建立一個或多個配置,以便被Endpoint來使用這些配置 --> <basicHttpBinding> <!-- 某一類的binding的下面可能有多個配置,binding元素的name屬性標識某個binding--> <binding name="binding名"> </binding> </basicHttpBinding> </bindings> <!-- 定義service和Endpiont行為--> <behaviors> <!-- 定義service的行為--> <serviceBehaviors> <!-- 一個或多個系統提供的或定制的behavior元素 屬性說明: name - 一個behavior唯一標識,<service>元素的behaviorConfiguration屬性指向這個name--> <behavior name=""> <!-- 指定service元數據發布和相關信息 屬性說明: httpGetEnabled - bool類型的值,表示是否允許通過HTTP的get方法獲取sevice的WSDL元數據 httpGetUrl - 如果httpGetEnabled為true,這個屬性指示使用哪個URL地址發布服務的WSDL, 如果這個屬性沒有設置,則使用服務的HTTP類型的baseAddress后面加上?WSDL--> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://URI:port/address" /> </behavior> </serviceBehaviors> <!-- 定義Endpiont的行為--> <endpointBehaviors> </endpointBehaviors> </behaviors> <!-- 包含客戶端跟服務端連接使用到的Endpoint的配置 --> <client> <!-- 每個客戶端Endpoint設置 屬性說明: address - 對應到服務端這個Endpoint的address binding - 指定這個Endpoint使用的binding,這個banding可以是系統預定義的9個binding之一, 比如是basicHttpBinding contract - 指定這個Endpoint對應的Contract的全限定名(名稱空間.類型名) name - Endpoint的配置名,客戶端代理類的構造方法中的endpointConfigurationName對應到這個name bindingConfiguration - 指定客戶端binding的具體設置,指向<bindings>元素下同類型binding的name --> <endpoint address="URI" binding="basicHttpBinding" bindingConfiguration="binding名" contract="Contract全限定名" name="endpoint配置名" /> </client> </system.ServiceModel> </configuration>
配置終結點