WCF行為類型基本概念簡述
開發人員在應用WCF開發工具進行實際編程時,可以利用這一平臺打造一個安全性技巧的解決方案,幫助我們解決一些特定問題。下面,我們首先來看看有關WCF行為類型的相關介紹,方便大家學習。#t#
WCF行為類型總共可以分為四種:服務行為、終結點行為、契約行為和操作行為。 這四種行為分別定義了四個接口:IServiceBehavior,IEndpointBehavior,IContractBehavior以及 IOperationBehavior。雖然是四個不同的接口,但它們的接口方法卻基本相同,分別為 AddBindingParameters(),ApplyClientBehavior()以及ApplyDispatchBehavior()。
注 意,IServiceBehavior由于只能作用在服務端,因此并不包含ApplyClientBehavior()方法。
我們可以定義自己的類實現這些WCF行為類型的接口,但需要注意幾點:
1、行為的作用范圍,可以用如下表格表示:
2、可以利用自定義特性的方式添加擴展的服務行為、契約行為和操作行為,但不能添加終結點行為;可以利用配置文件添加擴展服務行為和終結點行為,但不能添加契約行為和操作行為。但這些擴展的行為都可以通過ServiceDescription添加。
利用特性添加行為,意味著我們在定義自己的擴展行為時,可以將其派生自Attribute類,然后以特性方式添加。例如:
- [AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface)]
- public class MyServiceBehavior:Attribute, IServiceBehavior...
- [MyServiceBehavior]
- public interface IService...
如果以配置文件的方式添加WCF行為類型,則必須定義一個類繼承自BehaviorExtensionElement(屬于命名空間System.ServiceModel.Configuration),然后重寫屬性BehaviorType以及 CreateBehavior()方法。BehaviorType屬性返回的是擴展行為的類型,而CreateBehavior()方法則負責創建該擴展 行為的對象實例:
- public class MyBehaviorExtensionElement:BehaviorExtensionElement
- {
- public MyBehaviorExtensionElement() { }
- public override Type BehaviorType
- {
- get { return typeof(MyServiceBehavior); }
- }
- protected override object CreateBehavior()
- {
- return new MyServiceBehavior();
- }
- }
如果配置的Element添加了新的屬性,則需要為新增的屬性應用ConfigurationPropertyAttribute,例如:
- [ConfigurationProperty("providerName",IsRequired = true)]
- public virtual string ProviderName
- {
- get
- {
- return this["ProviderName"] as string;
- }
- set
- {
- this["ProviderName"] = value;
- }
- }
配置文件中的配置方法如下所示:
- < configuration>
- < system.serviceModel>
- < services>
- < service name="MessageInspectorDemo.Calculator">
- < endpoint behaviorConfiguration="messageInspectorBehavior"
- address="http://localhost:801/Calculator"
- binding="basicHttpBinding"
- contract="MessageInspectorDemo.ICalculator"/>
- < /service>
- < /services>
- < behaviors>
- < serviceBehaviors>
- < behavior name="messageInspectorBehavior">
- < myBehaviorExtensionElement providerName="Test"/>
- < /behavior>
- < /serviceBehaviors>
- < /behaviors>
- < extensions>
- < behaviorExtensions>
- < add name="myBehaviorExtensionElement"
- type="MessageInspectorDemo.MyBehaviorExtensionElement,
MessageInspectorDemo,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>- < /behaviorExtensions>
- < /extensions>
- < /system.serviceModel>
- < /configuration>
注意,在< serviceBehaviors>一節中,< behavior>下的< myBehaviorExtensionElement>就是我們擴展的行為,providerName則是 MyBehaviorExtensionElement增加的屬性。如果擴展了IEndpointBehavior,則配置節的名稱為< endpointBehaviors>。< extensions>節負責添加自定義行為的擴展。其 中,< add>中的name值與< behavior>下 的< myBehaviorExtensionElement>對應。
在對WCF行為類型操作時,特別注意的是< extensions>下的 type值,必須是類型的full name。第一個逗點前的內容為完整的類型名(包括命名空間),第二部分為完整的命名空間。Version,Culture以及 PublicKeyToken也是缺一不可的。每個逗點后必須保留一個空格,否則無法正確添加擴展行為的配置。這與反射有關,但太容易讓人忽略這一小細節。希望微軟能在后來的版本中修訂這個瑕疵。