zoukankan      html  css  js  c++  java
  • WCF自定义行为 Step by Step (二)第一个自定义行为

    follow我,一路做下去,直到完成这个Sample,不要问为什么,下一篇文章告诉你。

    本文添加的是自定义behavior的其中一种,ParameterInspector,就是说,client调用Service方法时传递的参数,我们可以在Service实际调用前进行筛选过滤。

    我们在上面那个例子上,定义我们自己的behavior。代码下载:WCFBehaviorSolution0.zip

    (一)添加类库CustomServiceBehaviors,这是Service的自定义behavior的类库。

    image

    然后在WcfServiceLibrary1和ServerConsoleApplication项目中都添加对CustomServiceBehaviors类库的引用。

    (二)为Service创建自定义behavior

    在CustomServiceBehaviors项目中创建MyParameterInspector类:

    public class MyParameterInspector : Attribute, IOperationBehavior, IParameterInspector
    {
        #region IOperationBehavior Members
    
        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
    
        }
    
        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
    
        }
    
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            dispatchOperation.ParameterInspectors.Add(this);
        }
    
        public void Validate(OperationDescription operationDescription)
        {
    
        }
    
        #endregion
    
        #region IParameterInspector Members
    
        public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
        {
            Console.WriteLine("after the call.");
        }
    
        public object BeforeCall(string operationName, object[] inputs)
        {
            Console.WriteLine("before the call.");
    
            inputs[0] = Convert.ToInt16(inputs[0]) + 1;
    
            return null;
        }
    
        #endregion
    }

    这个类就是我们的自定义行为。我们会在调用方法之前和之后都输入一些文字,并修改第一个输入参数,使其自增1。

    在Service端,我们要实现IOperationBehavior的ApplyDispatchBehavior方法,把当前这个ParameterInspector添加到行为的参数侦测器中。

    (三)局部修改ServiceHost(也就是ServerConsoleApplication项目)的Main函数:

    static void Main(string[] args)
    {
        using (ServiceHost host = new ServiceHost(typeof(Service1)))
        {
            host.Description.Endpoints[0].Contract.Operations[0].Behaviors.Add(new MyParameterInspector());
    
            host.Open();
    
            Console.WriteLine("Service started.");
    
            Console.ReadKey(true);
        }
    }

    其实就多了一句话:

    host.Description.Endpoints[0].Contract.Operations[0].Behaviors.Add(new MyParameterInspector());

    就是说,为配置文件中第1个Endpoint的第1个操作(这里是GetData方法)添加自定义行为MyParameterInspector

    至此,我们在Service端添加了一个自定义行为。

    相应地,更新Client中的Service Reference。

    //base.Endpoint.Contract.Operations[0].Behaviors.Add(new MyParameterInspector());

    先后运行ServerConsoleApplication和ClientConsoleApplication,结果如下:

    image

    我们看到,在Client端明明输入了1982,但是却输出1983。这是因为,在Service的自定义behavior中,函数BeforeCall修改了这个参数。

    完成后的代码示例下载:WCFBehaviorSolution1.zip

  • 相关阅读:
    MySQL之存储过程和函数
    Mysql中的常用函数:
    Mysql之使用Mysql运算符
    Mysql之单表记录查询
    Mysql之触发器的操作:
    Mysql之视图的操作
    Mysql之表的操作与索引操作
    Mysql之基本操作与数据类型
    Java多线程之生产者消费者
    Java多线程
  • 原文地址:https://www.cnblogs.com/Jax/p/1590260.html
Copyright © 2011-2022 走看看