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

原文地址:https://www.cnblogs.com/Jax/p/1590260.html