使用 SOAP 扩展修改 SOAP 消息
SOAP扩展允许通过更改往返于Web服务或Web服务客户端的SOAP消息来增加Web服务功能……
扩展 SOAPExtension 类
要实现 SOAP 扩展,从 SoapExtension 类派生一个类。有三种应该(或者必须)实现的 SOAPExtension 类的方法:
- ChainStream,这是一种虚拟方法
- GetInitializer,这是具有两个签名的抽象方法
- Initialize,这是一种抽象方法
- ProcessMessage,这是一种抽象方法
在分步指导的主题“演练:使用 SOAP 扩展更改 SOAP 消息”中解释了这些方法的实现方式。
会向 ChainStream 方法传递一个 Stream 对象,而该方法也会返回一个 Stream 对象。由于 SOAP 扩展在每个 SoapMessageStage 过程中执行并修改 SOAP 消息,SOAP 扩展应该从传入 ChainStream 的 Stream 进行读取并写入从 ChainStream 返回的 Stream。因此,在 ChainStream 方法内将两个 Stream 引用分配给成员变量十分重要。
从 SoapExtension 派生的类基于 Web 服务或应用它的 Web 服务方法,使用 GetInitializer 和 Initialize 方法初始化内部数据。例如,如果某个 SOAP 扩展用于记录发送到 Web 服务方法和从 Web 服务方法发送回的 SOAP 消息,则该 SOAP 扩展可能会初始化文件的名称以保存日志记录信息,该初始化过程基于 SOAP 扩展正在运行的 Web 服务或 Web 服务方法的名称。
Web 服务基础结构调用 GetInitializer 方法的时间以及传递给该方法的参数取决于 SOAP 扩展的配置方式,如下所示:
- 如果 SOAP 扩展是用属性配置的,则 Web 服务基础结构将在首次访问 Web 服务 method 时调用 GetInitializer。
- 如果 SOAP 扩展是在配置文件中配置的,则 Web 服务基础结构仅会在首次访问整个 Web 服务时调用 GetInitializer。
Web 服务基础结构缓存 GetInitializer 方法返回的对象。这样,每次 SOAP 扩展运行该 Web 服务或 Web 服务方法时,该基础结构都会将初始值对象传递给 Initialize 方法。
超出标准 SOAP 处理的实际扩展处理将由 ProcessMessage 方法执行。每次 Web 服务基础结构调用 ProcessMessage 时,都会(作为参数)传递从 SoapMessage 派生的类的实例,该实例包含在此特定阶段生成的有关 SOAP 消息的信息。如果 SOAP 扩展正在运行 Web 服务,则传入 SoapServerMessage 对象。如果 SOAP 扩展正在运行 Web 服务客户端,则传入 SoapClientMessage 对象。
SOAP 扩展和异常
SOAP 扩展必须永远不自行引发异常。但是,它们可以将异常信息添加到在 ProcessMessage 方法中传递的 SoapMessage 对象的 Exception 属性中。
它们还可以使用相同的功能,捕获为其安装了 SOAP 扩展的应用程序中的所有异常,并执行某些行为(包括修改返回的 SOAP 错误),从而充当应用程序范围的异常处理程序。
- 本文关键词:

