在调用应用程序中,服务模型层负责将应用程序代码中的方法调用转换为出站消息,将它们推送到基础通道,将结果转换回应用程序代码中的返回值和输出参数,并将结果返回给调用方。 服务模型扩展修改或实现执行或通信行为以及涉及客户端或调度程序功能、自定义行为、消息和参数拦截以及其他扩展性功能的功能。
本主题介绍如何在 Windows Communication Foundation (WCF) 客户端应用程序中使用 ClientRuntime 和 ClientOperation 类来修改 WCF 客户端的默认执行行为,或者在将消息、参数或返回值发送到通道层之前或从通道层检索它们之后截获或修改这些内容。 有关扩展服务运行时的详细信息,请参阅 扩展调度程序。 有关修改和插入自定义对象到客户端运行时的行为的详细信息,请参阅 “使用行为配置和扩展运行时”。
客户
在客户端上,WCF 客户端对象或客户端通道将方法调用转换为传出消息,并将传入消息转换为返回到调用应用程序的作结果。 (有关客户端类型的详细信息,请参阅 WCF 客户端体系结构。
WCF 客户端类型具有处理该终结点和操作级功能的运行时类型。 当应用程序调用操作时,ClientOperation 会将出站对象转换为消息,处理拦截器,确认出站调用符合目标合同,并将出站消息交给负责创建和管理出站通道(以及双向服务中的入站通道)的 ClientRuntime,处理多余的出站消息处理(如标头修改),处理双向消息拦截器,并将入站双向调用路由到相应的客户端 DispatchRuntime 对象。 ClientOperation和ClientRuntime在消息(包括错误)返回到客户端时提供类似的服务。
这两个运行时类是自定义 WCF 客户端对象和通道处理的主要扩展。 ClientRuntime 类允许用户截获和扩展约定中所有消息的客户端执行。 ClientOperation 类允许用户截获和扩展给定操作中所有消息的客户端执行。
通过合同、终结点和操作行为来修改属性或插入自定义项。 有关如何使用这些类型的行为来执行客户端运行时自定义的详细信息,请参阅 “使用行为配置和扩展运行时”。
情境
扩展客户端系统的原因有很多,包括:
自定义消息验证。 用户可能想要强制要求消息对特定架构有效。 这可以通过实现 IClientMessageInspector 接口并将实现分配给 MessageInspectors 属性来实现。 有关示例,请参阅 如何:在客户端检查或修改消息 和 如何:在客户端检查或修改消息。
自定义消息日志记录。 用户可能需要检查和记录一组流经终结点的应用程序消息。 也可以使用消息拦截器接口完成此作。
自定义消息转换。 用户可能希望对运行时中的消息应用某些转换(例如,版本控制),而不是修改应用程序代码。 这可以通过消息拦截器接口再次完成。
自定义数据模型。 用户可能希望使用除 WCF 默认支持的 System.Runtime.Serialization.DataContractSerializer、System.Xml.Serialization.XmlSerializer 和 System.ServiceModel.Channels.Message 对象之外的其他数据或序列化模型。 这可以通过实现消息格式化程序接口来实现。 有关详细信息,请参阅 System.ServiceModel.Dispatcher.IClientMessageFormatter 和 ClientOperation.Formatter 属性。
自定义参数验证。 用户可能希望强制实施类型化参数有效(而不是 XML)。 可以使用参数检查器接口完成此作。 有关示例,请参阅 “如何:检查或修改参数 ”或 “客户端验证”。
使用 ClientRuntime 类
类 ClientRuntime 是一个扩展点,可以向其添加可截获消息和扩展客户端行为的扩展对象。 截获对象可以处理特定协定中的所有消息,仅处理特定作的消息,执行自定义通道初始化,并实现其他自定义客户端应用程序行为。
CallbackDispatchRuntime 属性返回服务启动的回调客户端的调度运行时对象。
OperationSelector 属性接受自定义操作选择器对象。
该 ChannelInitializers 属性允许添加可以检查或修改客户端通道的通道初始值设定项。
该 Operations 属性获取一个 ClientOperation 对象集合,您可以向其中添加自定义消息拦截器,为该操作的消息提供特定功能。
该 ManualAddressing 属性使应用程序能够关闭某些自动寻址标头以直接控制寻址。
该 Via 属性设置传输级别消息的目标值以支持中介和其他方案。
MessageInspectors 属性获取一个 IClientMessageInspector 对象的集合,您可以为通过 WCF 客户端传输的所有消息添加自定义消息拦截器。
此外,还有一些其他属性用于获取合同信息。
如果 WCF 客户端是双工 WCF 客户端,以下属性还可以检索回调 WCF 客户端信息:
若要跨整个 WCF 客户端扩展 WCF 客户端执行,请查看 ClientRuntime 类上可用的属性,以便确定是否通过修改属性或实现接口并将其添加到属性上能够创建所需的功能。 选择要生成的特定扩展后,通过实现一种客户端行为来在调用时提供对ClientRuntime类的访问权限,将扩展插入到相应的ClientRuntime属性中。
可以通过操作行为(实现IOperationBehavior的对象)、契约行为(实现IContractBehavior的对象)或端点行为(实现IEndpointBehavior的对象)将自定义扩展对象插入到集合中。 安装行为对象可以编程方式、声明方式(通过实现自定义属性)或通过实现自定义 BehaviorExtensionElement 对象的方式添加到相应的行为集合中,以使该行为可以使用应用程序配置文件进行插入。 有关详细信息,请参阅 使用行为配置和扩展运行时。
有关演示如何跨 WCF 客户端截获的示例,请参阅 如何:检查或修改客户端上的消息。
使用 ClientOperation 类
该 ClientOperation 类是客户端运行时修改的位置,也是仅适用于单个服务操作的自定义扩展的插入点。 (若要修改协定中所有消息的客户端运行时行为,请使用 ClientRuntime 类。
使用 Operations 属性查找表示特定服务操作的 ClientOperation 对象。 通过以下属性,可以将自定义对象插入 WCF 客户端系统中:
使用 Formatter 属性为操作插入自定义 IClientMessageFormatter 实现,或修改当前格式器。
使用 ParameterInspectors 属性插入自定义 IParameterInspector 实现或修改当前实现。
以下属性使您能够修改系统与格式化程序和自定义参数检查器交互的方式:
使用 SerializeRequest 属性控制出站消息的序列化。
使用 DeserializeReply 属性控制入站消息的反序列化。
使用 Action 属性控制请求消息的 WS-Addressing 动作。
使用BeginMethod和EndMethod来指定哪些 WCF 客户端方法与异步操作相关联。
使用 FaultContractInfos 属性获取一个集合,该集合包含可在 SOAP 错误中显示为详细信息类型的类型。
使用IsInitiating和IsTerminating属性控制,在调用操作时是启动会话还是结束会话。
使用 IsOneWay 属性来控制该操作是否为单向操作。
使用 Parent 属性获取包含 ClientRuntime 对象。
使用 Name 属性来获取操作的名称。
使用SyncMethod 属性控制映射到该操作的方法。
若要仅在一个服务操作上扩展 WCF 客户端执行,请查看该类的可用属性,以确定是修改属性还是实现接口并将其添加到属性中,以实现所需功能。 选择要生成的特定扩展后,通过实现一种客户端行为来在调用时提供对ClientOperation类的访问权限,将扩展插入到相应的ClientOperation属性中。 然后,在该行为中,可以修改 ClientRuntime 属性以满足你的要求。
通常情况下,实现操作行为(实现 IOperationBehavior 接口的对象)就可以满足需要,但是也可以使用终结点行为和约定行为,通过定位特定操作的 OperationDescription 并在其中附加行为,以此达到相同的效果。 有关详细信息,请参阅 使用行为配置和扩展运行时。
若要在配置中使用自定义行为,请使用自定义行为配置节处理程序安装您的行为。 还可以通过创建自定义属性来配置行为。
有关演示如何跨 WCF 客户端拦截的示例,请参阅 如何:检查或修改参数。