WCF 扩展之我见: IParameterInspector

本系列索引,请见《开篇

当 WCF 运行时调用 MessageFormatter 将 Message 反序列化成 Parameters 后,就着会调用 IParameterInspector 对输入的参数及返回的参数进行检查。本文将会详细介绍下 ParameterInspector 的方方面面。

作 用

我曾经在本系列中介绍过 MessageInspector,它的作用是为了对请求和响应的消息进行检查和修改。本文所介绍的 ParameterInspector 同样具有类似的作用,可以用于对 Parameter 进行验证和修改。不过 MessageInspector 是针对 Message 而言,而 ParameterInspector 则是针对 Parameter,对于大部分开发人员而言,Parameter 会比 Message 更容易理解。

由于 ParameterInspector 直接位于 “方法调用” 的前后(中间没有其它扩展干扰),因此很多开发人员会基于 ParameterInspector 编写一些用于性能计数的逻辑来更客观的反应方法调用的性能。

执行时机

就像上面所说的,当反序列化成 Parameters 之后,就会调用 ParameterInsepctor.BeforeCall。此时,允许开发人员对输入的参数进行任意的操作。

在方法调用结束后,会先调用 ParameterInspector.AfterCall。此时,开发人员可以对返回值进行任意操作。当返回值修改完成后,才会将返回值序列化成 Message。

如何扩展

先来看一下接口定义:

    public interface IParameterInspector
    {
        object BeforeCall(string operationName, object[] inputs);        
        void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState);
    }


BeforeCall 的返回值会作为 AfterCall 的 correlationState 传进去,这与 CallContextInitializer 类似。我们可以利用这个返回值来记录方法调用的起始时间,这样在 AfterCall 当中就可以通过计算得到方法调用实际消耗的时间了。

由于实现比较简单,下面直接摘抄 MSDN 的例子:

public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
  Console.WriteLine(    "IParameterInspector.AfterCall called for {0} with return value {1}.", 
    operationName, 
    returnValue.ToString()
  );
}
public object BeforeCall(string operationName, object[] inputs)
{
  Console.WriteLine("IParameterInspector.BeforeCall called for {0}.", operationName);  return null;
}

当实现了自己的 ParameterInspector 之后,需要利用 Behavior 把该 Insepctor 关联到 WCF 运行时中,请参考《WCF 扩展之我见: Behaviors》。

文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charley Box | 关于本站 | 浙ICP备13014059号