WCF服务端基于配置的实现.docx_第1页
WCF服务端基于配置的实现.docx_第2页
WCF服务端基于配置的实现.docx_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论