鉴于一些理由需要拦截WCF方法,比如参数的检测。一个实际的场景是CSRF防范中需要对CsrfToken的检测。
要实现拦截,在形式上要实现两点:
1:为WCF方法增加特性类;
2:捕获WCF方法;
第一点很好实现,实现一个Attribute类。第二点则可以利用WCF框架中的IOperationInvoker接口,让该Attribute类同时也实现该接口,同时在该接口方法的ApplyDispatchBehavior方法中,为dispatchOperation实现一个新的OperationInvoker。

public class MyOperationInterceptorAttribute : Attribute, IOperationBehavior
{public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters){ }public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation){ }public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation){dispatchOperation.Invoker = new }public void Validate(OperationDescription operationDescription){ }
}public class MyInvoker : IOperationInvoker
{IOperationInvoker m_OldInvoker;    public object Invoke(object instance, object[] inputs, out object[] outputs){try{//do somethingobject result = m_OldInvoker.Invoke(instance, inputs, out outputParams);return result;}catch (Exception err){outputs = new object[0];//do catchreturn null;}finally{}}public virtual object[] AllocateInputs(){return m_OldInvoker.AllocateInputs();}public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state){return m_OldInvoker.InvokeBegin(instance, inputs, callback, state);}public object InvokeEnd(object instance, out object[] outputs, IAsyncResult result){return m_OldInvoker.InvokeEnd(instance, out outputs, result);}public bool IsSynchronous{get{return m_OldInvoker.IsSynchronous;}}
}

如果我们将服务宿主在IIS中,则这种实现的好处是我们可以完全不需要更改配置文件就能实现对WCF方法的拦截。
这种方式还有一种好处是,我们可以解析客户端发送过来的内容,并统一进行处理,而无需为WCF方法增加参数。如,我们对CSRF方法的时候,客户端发送过来的内容中会含有CSRFToken,传统的做法是为WCF方法一个CSRFToken的参数,如下:

public void DoSomething(string arg0, string csrfToken)
{Check(csrfToken);...
}

并且每个需要处理CSRF的方法中都要进行如上编码,而现在只要变成:

[MyOperationInterceptor]
public void DoSomething(string arg0)
{...
}

可以看到少了参数,少了方法内的处理,当然,我们需要在MyInvoker类的Invoke方法的//do something处解析前台内容,获取CSRFToken,并进行Check,获取CSRFToken如下实现:

string GetToken()
{//rest or soapstring token = HttpContext.Current.Request.QueryString["token"];if(string.IsNullOrEmpty(token)){XDocument doc = XDocument.Parse(OperationContext.Current.RequestContext.RequestMessage.ToString());var rootElements = (from p in doc.Descendants("root") select p).Elements();var args = (from p in rootElements select new {Name=p.Name.LocalName, Value=p.Value}).ToList(0;token = (from p in args where p.Name="token" select p.Value).First();}return token;
}

在这种拦截的应用中,有时候我们难免要将拦截过程中的一些内容传递到WCF方法中,如果有这样的需求,则可以将这些内容放置到OperationContet.Current.IncomingMessageProperties中,它是一个IDictionary<string, object>,当然,要对这个参数进行存取的时候,我们需要用到OperationContextScope,于是,整个MyInvoker类的Invoke方法变成如下的形式:

        try{using(OperationContextScope scope = new OperationContextScope()){//get token and checkOperationContet.Current.IncomingMessageProperties.Add("SomeKey", SomeObjectInstance);//do somethingobject result = m_OldInvoker.Invoke(instance, inputs, out outputParams);return result;}}catch (Exception err){outputs = new object[0];//do catchreturn null;}finally{}

在具体的WCF方法中,如果要使用这个SomeObjectInstance,则可以这样获得:
 SomeObjectInstance = OperationContet.Current.IncomingMessageProperties["SomeKeyas TheInstanceType;

WCF方法拦截及OperationInvoker传递参数到WCF方法的实现相关推荐

  1. java taken_java-是否有正确的方法在slf4j中传递参数?

    第三变种是最好的. 实际上,第一种情况是通过StringBuilder进行的字符串连接. 第二和第三种情况相同.他们需要将整数值装箱到Integer(或其他Object),然后创建一个数组来打包它们. ...

  2. java使用数组排序方法_java数组中的排序问题(冒泡排序方法的实现,及内置排序算法的应用)...

    在编程过程中对数组的运用也是很关键的,我们往往需要利用到数组,其中有一点就是当涉及到数组的排序问题,我们应该如何解决? 今天我来介绍两种常用的排序方法 一,冒泡排序序法 冒泡排序的原理: 1.比较相邻 ...

  3. python五种常见的排序方法是_常见的经典的排序方法的实现(Python)

    常见的经典算法的实现 首先来一张图,这张图总结了常见的几种排序算法的时间复杂度和空间复杂度的对比.现对常见的几种算法进行实现,以备后需.图片来源:专知 1. 快速排序 思路 先寻找一个基准数,然后接下 ...

  4. spring拦截器传递传递参数到controller+Aop切面环绕方法传递参数到目标方法

    一.前言 由于业务需要,在网上找了很久得到了这两种方式.本文代码偏少,主要讲解一下怎么传,如何接收,也记录一下,以便之后查看. 二.Spring拦截器传递参数到controller 下面是我拦截器中的 ...

  5. Android开发之fragment传递参数的两种方法

    非常简单一种是通过bundle,另外一种是通过fragment提供的instantiate(过时方法),都是kotlin版本,直接上代码吧: 方法一: //fragment传递参数方法一val fra ...

  6. python传递参数给sql_Python MySQLdb 执行sql语句时的参数传递方式

    使用MySQLdb连接数据库执行sql语句时,有以下几种传递参数的方法. 1.不传递参数 conn = MySQLdb.connect(user="root",passwd=&qu ...

  7. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  8. 简述使用混合传递参数时的基本原则_JUnit 5参数化方法测试(一)

    参数化简述 参数化允许我们为测试方法提供数据源(泛指数据集),平常我们使用的最多的或许是不带任何参数的形式,所有的必要数据都在类中或是方法中的本地变量亦或是直接常量写死了,这就导致测试变得较为繁琐,当 ...

  9. 请求体的方式传参_Angularjs中$http以post请求通过消息体传递参数的实现方法

    本文实例讲述了Angularjs中$http以post请求通过消息体传递参数的方法.分享给大家供大家参考,具体如下: Angularjs中,$http以post在消息体中传递参数,需要做以下修改,以确 ...

最新文章

  1. 您试图打开以前版本的Microsoft Office创建的文件。注册表策略设置已阻止此文件在该版本中打开的解决办法
  2. 优先队列的数组实现(有序)
  3. ITK:设置默认的线程数
  4. Centos 7下安装nginx,使用yum install nginx,提示没有可用的软件包(亲测)
  5. csc.exe已退出,代码为-532462766
  6. Oracle入门(十三)之SQL的DML
  7. 前端学习(758):预解析二
  8. 用ASP.NET MVC自己管理自己的View:ASP.NET MVC File Management 【转】
  9. tensorflow数据预处理
  10. ueditor接入秀米编辑器
  11. smart检测指标详解
  12. 基于WEB的网上购物系统的设计与实现(附:源码 论文 sql文件)
  13. 互联网公司中秋节礼盒大比拼(2019版)
  14. 解决git:fatal:Unable to create”…/.git/index.lock” 的错误
  15. 计算机表格怎么加减乘除,怎么在excel表格中计算加减乘除
  16. MAC开机密码破解方法
  17. aes hex 加密
  18. 分享几款让你工作事半功倍的软件
  19. 一个纯技术程序员的求职心酸历程
  20. mysql嵌套查询;去重,分页综合查询

热门文章

  1. python如何定义一个简单的栈
  2. 深度学习在工业推荐如何work?Netflix这篇论文「深度学习推荐系统Netflix案例分析」阐述DL在RS的优劣与经验教训...
  3. 最早的神经元从何而来?海绵基因图谱揭示神经系统起源
  4. 为什么AI感知与人类感知无法直接比较?
  5. 基本系统部署完成!北斗三号闪耀中国智慧
  6. 深度:语音技术革命正在改变人类的交流方式
  7. 潘建伟团队再登Nature:全球首次实现器件无关量子随机数,量子保密通信安全再升级...
  8. 学界 | DeepMind等机构提出「图网络」:面向关系推理
  9. 贝叶斯网络之父Judea Pearl:要建立真正的人工智能,少不了因果推理
  10. 这个重量级产业,中国正在爆发!