日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WCF服务端基于配置的实现——拦截

發布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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服务端基于配置的实现——拦截的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。