自定义行为可以在WCF创建运行时和消息处理管道时让你在重要的地方插入代码。行为可以添加到代码中,通过属性或配置文件手动实现服务描述。在所有的情况中,代码可以做一些辅助动作,比如在一个目录中寻找信息或者为了审计的目的记录数据。
图片5.14显示了在客户端创建自定义行为的接口
图片5.15显示了在服务端创建并插入自定义行为的接口
实现自定义行为需要三步
第一步 创建一个类并实现Inspector, Selector, Formatter或者Invoker接口。这一般情况下取决于你的行为的作用。比如,为了记录所有的请求一个服务的消息(就像在第九章"诊断"中使用system.diagnostics实现的那样),你可以实现IDispatchMessageInspector并将代码加入到AfterReceiveRequest方法中。另外一个例子,如果你想要代码在一个操作调用之前和之后立即执行,你可以实现IOperationInvoker并在Invoke方法中添加代码。然而,如果你的目标是在运行时上操作(验证或者维持信道栈中的绑定),而不是在消息官道上操作(检测消息/参数,或者选择/调用操作)可以跳过这一步。
第二步 创建一个类并实现行为接口中的一个: IServiceBehavior, IEndpointBehavior,IOperationBehavior或者IContractBehavior.使用ApplyClientBehavior或者ApplyDispatchBehavior方法,将你在上一步创建的类加入到行为列表中。再次,如果你的目标是在运行时上操作(验证或者维持信道栈中的绑定),而不是在消息管道上操作(检测消息/参数,或者选择/调用操作),你可以仅仅将这个逻辑插入到Validate或者类的AddBindingParameter方法而不是应用到一个客户端或者分发给将要执行的行为。
第三步 设置客户端和服务端来实现行为。这可以通过代码实现,配置文件,或者使用下面方法中的一个的属性:
设置ServiceDescription来添加行为。如果你使用的是自寄宿的服务,你可以添加行为类到服务行为列表(如果你在添加一个IServiceBehavior)或者到终结点列表或者在每个终结点上的契约行为(如果你在使用IEndpointBehavior,IContractBehavior或者IOperationBehavior).这是最自我控制,但最少维护的机制,因为任何在服务端的行为改变都要进行重新编译。
使用属性向客户端或者服务端运行时添加行为。为了实现这个,你应该实现属性接口。这允许开发人员当在他们的代码中定义服务,终结点或者操作时使用属性。
使用配置文件向客户端或者服务端运行时添加行为。为了实现这个,你必须做额外的两个步骤。首先,创建一个实现了BehaviorExtensionElement接口的类并在那个类中使用[ConfigurationProperty]定义配置数据元素。在那个接口,你也必须实现CreateBehavior和BehaviorType方法来创建并返回你的新的BehaviorExtension类。然后,在将会使用行为的客户端或者服务端的配置文件中,你需要在你引用完全资格类型的部分添加<behaviorExtensions>,然后在服务层或者终结点层使用行为。当你完成了这三步以后,行为就可以使用了。它将在客户端或者服务端创建它的运行时和每条消息从客户端或者服务端被发送接收时自动被调用。这部分的剩余内容描述特殊行为。
将在后文继续讲述...