扩展WCF自定义行为(一)
一,WCF运行时体系结构
由于WCF完全是由托管代码编写,所以WCF提高了一个高级运行时来针对应用程序开发人员,它常被称为服务模型层。该高级运行时主要由一个称作调度程序(在服务主机上下文中)的组件和一个称作代理(在客户端上下文中)的组件组成。调度程序,代理的主要作用是在 WCF 消息对象和 Microsoft® .NET Framework 方法调用间进行转换。 这些组件按照一系列明确定义的步骤来执行此过程,并在此过程的每个步骤中都提供了可供插入的扩展点。您可以使用这些扩展点来实现各种自定义行为,包括消息 或参数验证、消息日志记录、消息转换、自定义序列化/反序列化格式、输出缓存、对象共用、错误处理和授权等。调度程序和代理都提供了大量的扩展点,您可以在其中插入自己的代码;这些扩展常被称为侦听器,因为它们允许您侦听默认的运行时执行行为。不过,我通常称它们为运行时扩展。
二,客户端代理扩展
下图显示了客户端代理体系结构及可用的扩展点。代理的主要作用是将调用方提供的对象(参数)转换为 WCF 消息对象,然后将后者提供给底层通道堆栈进行网络传输。在此过程中,您可以使用可用的第一个扩展点来执行自定义参数检查。还可以使用该扩展点执行自定义验证、值修改或特殊过滤。接着,代理使用序列化程序将提供的参数转换为 WCF 消息对象。此时,您可以使用一个自定义的格式化程序对象在第二个扩展点来自定义序列化过程。代理生成 Message 对象后,可以使用第三个扩展点来检查产生的 Message 对象,然后将其提交给通道堆栈。
三,服务端调度扩展
下图显示了调度程序扩展点,这个图与上一个图很相似,但是在该图中,扩展点是按相反顺序执行的,并且多了客户端中不存在的扩展点。当调度程序收到来自通道堆栈的 Message 对象时,遇到的第一个扩展点便是消息检查。然后,调度程序必须选择一个要调用的操作(第二个扩展点),然后才能继续( 这里有一个扩展点用于覆盖默认的操作选择行为)。确定目标操作后,调度程序会将消息反序列化为调用目标方法时可作为参数提供的对象。此时(第三个扩展点),调度程序提供用于进行消息格式化(反序列化)和参数检查(第四个扩展点)。调度程序的最后一步是调用提供就绪参数的目标方法。您甚至可以通过提供自定义的操作调用程序对象来替代这一步(第五个扩展点)。
下一篇文章将以一个Demo的方式讨论如何WCF定义的扩展点接口及其示范性的实现。