follow我,一路做下去,直到完成这个Sample,不要问为什么,下一篇文章告诉你。
本文添加的是自定义behavior的其中一种,ParameterInspector,就是说,client调用Service方法时传递的参数,我们可以在Service实际调用前进行筛选过滤。
我们在上面那个例子上,定义我们自己的behavior。代码下载:WCFBehaviorSolution0.zip
(一)添加类库CustomServiceBehaviors,这是Service的自定义behavior的类库。
然后在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,结果如下:
我们看到,在Client端明明输入了1982,但是却输出1983。这是因为,在Service的自定义behavior中,函数BeforeCall修改了这个参数。
完成后的代码示例下载:WCFBehaviorSolution1.zip