標籤:des blog http os io 使用 strong ar for
一、綁定行為概述
為了支援服務端的其它本地特性,WCF定義了行為的概念。行為就是服務的本地特性,不會影響服務的通訊模式。用戶端並不知道服務端行為,所以行為不會出現在服務的綁定和發布的中繼資料中。說下WCF下“契約(Contract)”和“行為(Behavior)”的區別:契約是涉及雙邊的描述(契約是服務的提供者和服務消費者進行互動的手段),那麼行為就是基於單邊的描述。用戶端行為體現的是WCF如何進行服務調用的方式,而服務端行為則體現了WCF的請求分發方式。所以服務契約會通過中繼資料對外發布,而WCF服務行為則對於用戶端是透明的。
通過將行為應用於系統的各個不同部分,可以控制WCF的會話管理、並發性、限流(Throttling)和事務等活動,其中一些活動只能應用在某個層級上,如服務等級,終結點層級、操作層級和契約層級。
針對不同的層級,可以用不同的方法設定行為。大多數行為可以通過配置或配置中的特性進行設定。儘管大多數行為都可以通過配置參數來進行設定,但有些行為必須在代碼中進行設定。
二、服務行為
通過[ServiceBehavior]特性,可以在服務等級上應用規則和行為。在設計時,可以利用以下屬性來控制行為的並發性、執行個體化、限流、事務、會話和線程等:
- AddressFilterMode:允許修改訊息過濾器。AddressFilterMode屬性有三個值:Any(WCF會關閉基於地址的訊息篩選機制,它允許路由服務處理攜帶的目標地址(WS-Addressing的<To>前序,適用於訊息路由)與本終結點不一致的請求訊息)、Exact(指示對傳入訊息的地址執行精確匹配的篩選器)、Prefix(指示對傳入訊息的地址執行最長首碼匹配的篩選器),預設值為Exact。
- AutomaticSessionShutdown:AutomaticSessionShutdown預設為true,當用戶端關閉代理時,會話會被終止。將其設定為false,則會話會繼續直到服務顯式地關閉其發送通道,這樣就可以控制會話的生命週期了。
- ConcurrencyMode:用此參數可以設定服務是以單線程還是多線程運行。預設值是Single。將它設定為Multiple,則意味著在服務中必須實現安全執行緒。
- IgnoreExtensionDataObject:此參數是一個布爾值,預設為false。將它設定為true,則意味著訊息中不帶任何未知的序列化資料。
- IncludeExceptionDetailInFaults:如果需要把未處理的異常作為SOAP訊息發送給用戶端,就需要把此訊息參數設定為true。在開發環境中,需要將此參數設定為true;在生產環境,需要將它設為false。
- InstanceContextMode:用此屬性可以設定服務執行個體的生命週期。它的值可以取PerCall(新的 System.ServiceModel.InstanceContext 對象在每次調用前建立,在調用後回收)、PerSession(為每個會話建立一個新的 System.ServiceModel.InstanceContext 對象)、Single(只有一個 System.ServiceModel.InstanceContext 對象用於所有撥入電話,並且在調用後不回收。如果服務物件不存在,則建立一個),預設為PerSession。關於實力管理的詳細資料,在後續會講到。
- MaxItemsInObjectGraph:此屬性用來設定允許在序列化和還原序列化的對象圖中出現的最大項數。
- ReleaseServiceInstanceOnTransactionComplete:如果把此參數設定為true,則表示當前活動事務結束後釋放服務物件。
- TransactionAutoCompleteOnSessionClose:如果希望在會話被用戶端正常關閉時,把當前活動事務標誌為結束,就需要將此參數設定為true。
- TransactionIsolationLevel:當事務出於活動狀態時,指定當前對象的隔離等級。Chaos(無法覆蓋隔離等級更高的事務中的暫止的變更)、ReadCommitted(可以在事務期間讀取可變資料,但是不可以修改它)、ReadUncommitted(可以在事務期間讀取和修改可變資料)、RepeatableRead(可以在事務期間讀取可變資料,但是不可以修改。可以在事務期間添加新資料)、Serializable(可以在事務期間讀取可變資料,但是不可以修改,也不可以添加任何新資料)、Snapshot(可以讀取可變資料。在事務修改資料之前,它驗證在它最初讀取資料之後另一個事務是否更改過這些資料。 如果資料已被更新,則會引發錯誤。 這樣使事務可擷取先前提交的資料值)、Unspecified(正在使用與指定隔離等級不同的隔離等級,但是無法確定該層級。 如果設定了此值,則會引發異常)。
- TransactionTimeout:設定事務的逾時時間,超過此時間之後,此事務即被認為已經中止,復原過程被啟用。
- UseSynchronizationContext:該值指定是否使用當前同步上下文來選擇執行的線程
- ValidateMustUnderstand:此屬性用來關閉對標誌為MustUnderstand的SOAP頭的驗證。預設為true。
三、操作行為
利用OperationBehavior特性控制類的方法,利用類的方法可以進一步控制服務的某些方面。在操作層級可以控制的行為有事務行為、訪問者身份識別行為和對象回收行為。
- AutoDisposeParameters:此屬性允許操作自動釋放輸入、輸出和引用參數。預設為false。
- Impersonation:有時需要以訪問者的身份執行操作。為了滿足這種需求,需要把這個屬性設定為Required或Allowed。
- ReleaseInstanceMode:此屬性允許覆蓋當前服務物件的 InstanceContextMode回收值。可能的取值有None(根據 InstanceContextMode 值回收對象)、BeforeCall(在叫用作業前回收對象)、AfterCall(在完成操作後回收對象)、BeforeAndAfterCall(在叫用作業前和完成操作後回收對象)。預設值為None。
- TransactionAutoComplete:當事務啟動時,如果當前方法沒有產生錯誤,則這個屬性會把當前事務標誌為結束,否則放棄此事務。當這個屬性設定為false時,必須手工把事務標誌為結束或放棄。
- TransactionScopeRequired:通過此屬性可判斷一個事務是否是當前方法所請求的。
利用OperationBehavior特性,可以控制與服務作業有密切關係的參數。只需把此特性應用於需要管理的操作上,然後根據具體需要設定行為的屬性參數,就可以得到所需要的行為,代碼如下所示:
[OperationBehavior(AutoDisposeParameters=true, Impersonation=ImpersonationOption.NotAllowed, ReleaseInstanceMode=ReleaseInstanceMode.None, TransactionAutoComplete=true, TransactionScopeRequired=false)]public void SayOneWay(string str){ Console.WriteLine(str);}
上面這個樣本中,OperationBehavior特性的全部屬性都取的是預設值。
四、終結點行為
雖然服務行為只在服務端有用,但是終結點行為既可以應用於所有服務,也可以應用於用戶端。給終結點設定適合的行為可以實現對用戶端認證的使用的序列化器參數的管理。WCF提供了一組預先定義好的行為,其中每個行為都可以實現System.ServiceModel.Description.IEndpointBehavior介面:
- AddBindingParameters:用此行為檢查當前服務描述並可以根據終結點行為的需要修改綁定參數,此方法對每個終結點只能調用一次。
- ApplyDispatchBehavior:IEndpointBehavior介面最重要的方法,可以通過它將終結點的行為邏輯應用程式於服務端。
- Validate:此方法用來檢查服務描述,當服務描述無法滿足終結點行為需要時就拋出一個異常。
可以通過設定檔、編程或兩者結合的方式,來設定各種on個不同的終結點行為。不同於服務行為,終結點行為既可以用在用戶端,也可以用在服務端。有些特殊實現只允許應用於用戶端,比如ClientCredential行為。
利用設定檔,可以定義並配置終結點的行為。例如在用戶端,如果希望在調用相關終結點時必須提供認證,就可以使用ClientCredential行為,如下代碼所示:用戶端設定檔
<?xml version="1.0" encoding="utf-8" ?><configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IHelloWorldService" /> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:8000/HelloWorldService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IHelloWorldService" contract="IHelloWorldService" name="WSHttpBinding_IHelloWorldService" behaviorConfiguration="carRentalEndpointBehavior"> <identity> <userPrincipalName value="網\001" /> </identity> </endpoint> </client> <behaviors> <endpointBehaviors> <behavior name="carRentalEndpointBehavior"> <clientCredentials> <clientCertificate findValue="CN=client_cert" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectDistinguishedName" /> </clientCredentials> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel></configuration>
認證安全可以參見:WCF使用X509認證,認證安全後續會有介紹,這裡不過多介紹。
五、契約行為
通過實現System.ServiceModel.Description.IContractBehavior介面可以擴充或修改契約的各個方面,這種方法適合於契約的整個周期。該介面有4個方法,他們都可以用於契約的修改。遇有不能在設定檔中使用契約行為,因此只能在代碼中或者通過屬性修改契約行為。System.ServiceModel.Description.IContractBehavior介面的4個方法如下:
- AddBindingParameters:此方法允許添加自訂參數,這些參數常用於控制行為的執行。此方法對於每個終結點來說只能執行一次。
- ApplyClientBehavior:可以使用這個方法在用戶端應用行為邏輯。
- ApplyDispatchBehavior:可以使用這個方法在服務用戶端應用行為邏輯。
- Validate:用於驗證行為執行時的運行時上下文。
對於IEndpointBehavior,IContractBehavior既可以應用於契約介面的用戶端,也可以應用於契約介面的服務端 。然而,一個IContractBehavior實現卻不能在運行時通過設定檔進行修改,只能在設計時通過屬性或編程方法進行添加。
[DeliveryRequirements(QueuedDeliveryRequirements=QueuedDeliveryRequirementsMode.NotAllowed,RequireOrderedDelivery=true)]public class HelloWorldService : IHelloWorldService{ //} 在上述樣本中,DeliveryRequirements表示契約不是按序列發送,而是要求訊息按順序發送。
參考書籍:《WCF 4 進階編程》
[WCF編程]6.綁定行為