WCF服务端基于配置的实现——拦截
??? 如果說到攔截器,相信大家都不陌生,所有的AOP都依賴各種形式的攔截器。為了讓WCF服務端的行為發生變化,這里要借助攔截器的力量。
問題:WCF里面如何創建一個攔截器?
??? 事實上,WCF里面有很多種攔截器,分別用于攔截不同的信息。這里要改變的是方法的實現部分,因此,只要攔截WCF操作就可以達到目的。
??? 那么,如何攔截操作哪?
??? 如果熟悉WCF的話,那么,一定知道有這么一個接口:IOperationInvoker
??? 這個接口的核心方法為:Invoke及其異步方法
問題:如何把一個實現IOperationInvoker的實例注入WCF
??? 仔細看一下MSDN,或者看reflector,就可以發現,所有實現IOperationInvoker的類型,幾乎都是通過各種OperationBehavior加入的。
??? 而所有的OperationBehavior都實現了一個IOperationBehavior接口。
主角和設計約束
??? 主角們在剛才的兩個問題中已經全部登場了:IOperationInvoker和IOperationBehavior
??? 剩下來的問題是如何實現這兩位主角。
??? 為了簡化期間,這里只考慮這樣的情況:所有的操作只有一個輸入值和一個輸出值,以及只有同步操作。當然這里的一個輸入/輸出是指一個簡單或復雜值,也就說,需要傳多個值時,使用一個自定義類型來包裹這多個值。
實現
??? 先說說實現IOperationInvoker,這里盜用一下MVC的概念,不妨將我們的實現控制器聲明為:ControllerInvoker
??? 簡單的示意:
1: internal sealed class ControllerInvoker 2: : IOperationInvoker 3: { 4: ? 5: private readonly IOperationInvoker Inner; 6: ? 7: public ControllerInvoker(IOperationInvoker inner) 8: { 9: Inner = inner; 10: } 11: ? 12: public object[] AllocateInputs() 13: { 14: return Inner.AllocateInputs(); 15: } 16: ? 17: public object Invoke(object instance, object[] inputs, out object[] outputs) 18: { 19: // do something before invoking 20: object result = Invoke(instance, inputs, out outputs); 21: // do something after invoking 22: return result; 23: } 24: ? 25: public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state) 26: { 27: throw new NotSupportedException(); 28: } 29: ? 30: public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result) 31: { 32: throw new NotSupportedException(); 33: } 34: ? 35: public bool IsSynchronous 36: { 37: get { return true; } 38: } 39: }???? 我們的Invoker目前什么好事情也沒做(壞事倒是做了一樁,引入了不支持異步),別急,這個類還沒完工哪。
??? 再看看Behavior需要做什么:
1: [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)] 2: public sealed class ControllerAttribute 3: : Attribute, IOperationBehavior 4: { 5: ? 6: void IOperationBehavior.AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters) { } 7: ? 8: void IOperationBehavior.ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation) { } 9: ? 10: void IOperationBehavior.ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) 11: { 12: dispatchOperation.Invoker = new ControllerInvoker(dispatchOperation.Invoker); 13: } 14: ? 15: void IOperationBehavior.Validate(OperationDescription operationDescription) { } 16: ? 17: }??? 好,攔截的外殼已經準備好了,來一個實例看看:
1: [ServiceContract(Namespace="urn:Zhenway.Test")] 2: public interface ITest 3: { 4: [Controller] 5: [OperationContract] 6: TestResponse Test(TestRequest req); 7: }??? 是不是很簡單。
下篇預告
??? 今天說了半天,都在說如何攔截的問題,還有個更大的問題如何路由,以及怎么實現動態路由,請看下篇。
轉載于:https://www.cnblogs.com/vwxyzh/archive/2010/10/27/1862569.html
總結
以上是生活随笔為你收集整理的WCF服务端基于配置的实现——拦截的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Preloading组件。
- 下一篇: 关于Socket通信服务的心跳包(转)