WCF行為擴展正確內容應用技巧分享
WCF中的一些行為應用在實際應用中是一個非常重要的知識點。我們今天將會針對WCF行為擴展的相關內容做一個詳細的介紹,希望對此又需要的朋友們可以通過本文介紹的內容充分掌握這一應用技術。#t#
WCF以其靈活的可擴展架構為開發者提供了方便,其中對行為的擴展或許是應用中最為常見的。自 定義對WCF行為擴展并不復雜,但仍有許多細節需要注意。在服務端,一般是對DispatchRuntime和DispatchOperation進行擴展, 擴展點包括了對參數和消息的檢查,以及操作調用程序,它們對應的接口分別為 IParameterInspector,IDispatchMessageInspector以及IOperationInvoker。而在客戶端,則是對ClientRuntime和ClientOperation進行擴展,擴展點包括對參數和消息的檢查,對應的接口分別為 IParameterInspector和IClientMessageInspector。這些接口類型均被定義在 System.ServiceModel.Dispatcher命名空間下,其中IParameterInspector接口可以同時作用在服務端和客戶 端。
對這些接口的實現,有點類似于AOP的實現,可以對方法調用前和調用后注入一些額外的邏輯,所以通常會將這些WCF行為擴展稱為偵聽器。例如IParameterInspector接口,就定義了如下方法:
- void AfterCall(string operationName, object[] outputs,
object returnValue, object correlationState);- object BeforeCall(string operationName, object[] inputs);
在調用服務對象的目標方法前,會調用BeforeCall方法,而在調用后則會調用AfterCall方法。例如我們可在方法調用前檢驗計算方法的參數是否小于0,如果小于0則拋出異常:
- public class CalculatorParameterInspector:IParameterInspector
- {
- public void BeforeCall(string operationName, object[] inputs)
- {
- int x = inputs[0] as int;
- int y = inputs[1] as int;
- if (x <0 || y < 0)
- {
- throw new FaultException("The number can not be less than zero.");
- }
- return null;
- }
- public void AfterCall(string operationName, object[] outputs,
object returnValue, object correlationState)- {
- //empty;
- }
- }
對消息的檢查區分了服務端和客戶端,接口方法根據消息傳遞的順序剛好相反[注]。我們可以通過接口方法對消息進行處理,例如打印消息的Header:
- public class PrintMessageInterceptor : IDispatchMessageInspector
- {
- #region IDispatchMessageInspector Members
- public object AfterReceiveRequest(ref System.ServiceModel.Channels.
Message request, IClientChannel channel, InstanceContext instanceContext)- {
- MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
- request = buffer.CreateMessage();
- Console.WriteLine("After Receive Request:");
- foreach (MessageHeader header in request.Headers)
- {
- Console.WriteLine(header);
- }
- Console.WriteLine(new string('*', 20));
- return null;
- }
- public void BeforeSendReply(ref System.ServiceModel.Channels.
Message reply, object correlationState)- {
- MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
- reply = buffer.CreateMessage();
- Console.WriteLine("Before Send Request:");
- foreach (MessageHeader header in reply.Headers)
- {
- Console.WriteLine(header);
- }
- Console.WriteLine(new string('*', 20));
- }
- #endregion
- }
WCF提供了四種類型的行為:服務行為、終結點行為、契約行為和操作行為。 這四種WCF行為擴展分別定義了四個接口:IServiceBehavior,IEndpointBehavior,IContractBehavior以及 IOperationBehavior。雖然是四個不同的接口,但它們的接口方法卻基本相同,分別為 AddBindingParameters(),ApplyClientBehavior()以及ApplyDispatchBehavior()。注 意,IServiceBehavior由于只能作用在服務端,因此并不包含ApplyClientBehavior()方法。