• WCF自定义行为 Step by Step (四)第二个自定义behavior


    我们在第一个自定义behavior的示例中,在Service端定义了一个behavior,这是一个ParameterInspector。代码下载:WCFBehaviorSolution1.zip

    我们也可以在Client定义一个ParameterInspector。这与Service是否自定义了behavior无关。所以,我们可以基于WCFBehaviorSolution0.zip,也可以基于WCFBehaviorSolution1.zip

    这里,让我们基于WCFBehaviorSolution0.zip这个最简单的例子。

    (一)创建类库CustomClientBehaviors,并建立MyParameterInspector 类,这个behavior是让输入参数自减1:

    public class MyParameterInspector : IOperationBehavior, IParameterInspector
    {
        #region IOperationBehavior Members
    
        public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
    
        }
    
        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {
            clientOperation.ParameterInspectors.Add(this);
        }
    
        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
    
        }
    
        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] = "BaoBao";
            return null;
        }
    
        #endregion
    }

    (二)在项目ClientConsoleApplication中添加对类库CustomClientBehaviors的引用。然后打开ServiceReference1,找到Reference.cs:

    image 
     
    修改其中带有一个参数的构造函数,我们把MyParameterInspector这个自定义行为添加到GetData方法(也就是Operations[0])上:
    public Service1Client(string endpointConfigurationName) :
        base(endpointConfigurationName)
    {
        base.Endpoint.Contract.Operations[0].Behaviors.Add(new MyParameterInspector());
    }

    (三)在Client端,也就是项目ClientConsoleApplication中,调用Service1Client带有参数的构造函数:

    static void Main(string[] args)
    {
        ServiceReference1.Service1Client client = new ClientConsoleApplication.ServiceReference1.Service1Client("WSHttpBinding_IService1");
    
        string price = client.GetData(1982);
    
        Console.WriteLine(price);
    
        Console.ReadKey(true);
    }

    注意这个参数,它是终结点的Name,我们查找app.config:

    <endpoint address="http://localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/Service1/"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
        contract="ServiceReference1.IService1" name="WSHttpBinding_IService1">

    发现这个值是WSHttpBinding_IService1,对,就把这个值作为上述构造函数的参数值。

    运行这个程序,效果如下所示,我们在Client输入了参数1982,在传给Service之前就减少了1,变成了1981:

    image

    最终的代码示例下载:WCFBehaviorSolution2.zip

  • 相关阅读:
    js怪招(摘录篇)
    猪八戒实习笔记(工具总结)
    2014年最新前端开发面试题(面霸题库)
    经典算法:快排的Javascript版本
    IE的CSS相关的BUG(整理一)
    setTimeout()的返回值
    面试回忆录(三)
    面试回忆录(二)
    读取指定文件夹下的全部文件,可通过正则进行过滤,返回文件路径数组 -- 基于node的一个函数
    Backbone简单示例
  • 原文地址:https://www.cnblogs.com/Jax/p/1590262.html
Copyright © 2020-2023  润新知