WCF开发工具中具有许多比较突出的优势特点,这也决定了它在开发领域中所占据的主导地位。在这里,我们将会为大家详细介绍一下有关WCF扩展点的相关应用方式,以帮助大家掌握这一工具的应用。#t#
Communication Foundation (WCF) 提供了许多WCF扩展点,供开发人员自定义运行时行为,从而实现服务调度和客户代理调用。您可以通过编写能以声明方式应用到服务中的自定义行为来使用这些扩展点。
WCF 在通道层的顶部还提供了一个高级运行时,主要是针对应用程序开发人员。在 WCF 文档中,它常被称为服务模型层。该高级运行时主要由一个称作调度程序(在服务主机上下文中)的组件和一个称作代理(在客户端上下文中)的组件组成。
调度程序/代理组合的主要作用是在 WCF 消息对象和 .NET Framework 方法调用间进行转换)。这些组件按照一系列明确定义的步骤来执行此过程,并在此过程的每个步骤中都提供了可供插入的扩展点。您可以使用这些扩展点来实现各种自定义行为,包括消息或参数验证、消息日志记录、消息转换、自定义序列化/反序列化格式、输出缓存、对象共用、错误处理和授权等.
1.调度程序/代理扩展
调度程序和代理都提供了大量的WCF扩展点,您可以在其中插入自己的代码;这些扩展常被称为侦听器,因为它们允许您侦听默认的运行时执行行为。不过,我通常称它们为运行时扩展。
显示了客户端代理体系结构及可用的扩展点。代理的主要作用是将调用方提供的对象(参数)转换为 WCF 消息对象,然后将后者提供给底层通道堆栈进行网络传输。
可以通过 ClientOperation 和 ClientRuntime 对象在代理上配置这些扩展。您可以找到一个用于各种服务操作的 ClientOperation 对象和一个用于从整体上配置代理的 ClientRuntime 对象。ClientOperation 提供了用于管理参数检查和消息格式化扩展的属性,而 ClientRuntime 则提供了用于管理消息检查扩展的属性。
当调度程序收到来自通道堆栈的 Message 对象时,遇到的第一个扩展点便是消息检查。然后,调度程序必须选择一个要调用的操作(步骤 2),然后才能继续 — 这里有一个扩展点用于覆盖默认的操作选择行为。确定目标操作后,调度程序会将消息反序列化为调用目标方法时可作为参数提供的对象。此时(步骤 3),调度程序提供用于进行消息格式化(反序列化)和参数检查(步骤 4)的扩展点。调度程序的最后一步是调用提供就绪参数的目标方法。您甚至可以通过提供自定义的操作调用程序对象来替代这一步。
可以通过 DispatchRuntime 和 DispatchOperation 对象在调度程序上配置这些扩展。稍后我将简要介绍如何访问这些对象,不过,首先让我们讨论一下如何实现它们。
2 实现自定义扩展
上述的每个WCF扩展点都是根据 .NET 接口定义来模拟的。注意,在某些情况下,相同的逻辑扩展类型要求在调度程序和代理端之间使用另一接口。下面我将详细介绍如何实现其中的部分接口。
消息检查器
不管是什么操作,假设您要检查的是流入和流出服务的消息,而不是参数。在这种情况下,您需要使用消息检查WCF扩展点。与参数检查不同,此时用于调度程序和代理(分别是 IDispatchMessageInspector 和 IClientMessageInspector)的消息检查接口是不同的。不过,当需要支持两端时,始终可以实现这两个接口。
IDispatchMessageInspector 有两个方法:AfterReceiveRequest 和 BeforeSendReply,这样您就有前侦听点和后侦听点来检查 WCF 消息对象了。IClientMessageInspector 还有两个提供相反点的方法:AfterReceiveReply 和 BeforeSendRequest。