zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    windows下开启docker占用内存过高解决办法
    如何与别人共享Docker镜像
    使用docker部署springboot应用
    使用docker安装mysql5.7
    win10家庭版安装docker
    alibaba sentinel简单实践
    mysql函数GROUP_CONCAT()
    SVN同步时报错:“Previous operation has not finished; run 'cleanup' if it was interrupted”
    Eclipse从SVN检出maven项目后的一些配置
    完美解决 Uncaught SyntaxError: Unexpected token ‘<‘
  • 原文地址:https://www.cnblogs.com/Jax/p/1590262.html
Copyright © 2011-2022 走看看