头处理程序

头处理程序是用户编写的 CICS® 程序,从 CICS提供的 SOAP 1.1 和 SOAP 1.2 消息处理程序链接到这些程序,以便处理 SOAP 头块。

您可以使用 CICS 支持的任何语言编写头处理程序,并在 DPL 子集中使用任何 CICS 命令。 头处理程序可以链接到其他 CICS 程序。

头处理程序具有通道接口; 容器包含头程序可以检查或修改的信息,包括调用该程序的 SOAP 头块以及 SOAP 消息体。

头处理程序接口中描述了头处理程序可以使用的通道和容器。

其他容器包含有关在其中调用头程序的环境的信息,例如:
  • 调用头程序时所使用的事务标识
  • 是否为服务提供者或请求者管道调用了程序
  • 正在处理的消息是请求还是响应

头处理程序通常在使用属性 TASKDATALOC (ANY)定义的事务 CPIH 下运行。 因此,在链接编辑程序时,必须指定 AMODE (31) 选项。

如何为 SOAP 请求调用头处理程序

管道配置中的 <cics_soap_1.1_handler><cics_soap_1.2_handler><cics_soap_1.1_handler_java><cics_soap_1.2_handler_java> 元素包含零个,一个或多个 <headerprogram> 元素,每个元素都包含以下子代:
  • <program_name>
  • <namespace>
  • <localname>
  • <mandatory>
当管道正在处理入站 SOAP 消息 (对于服务提供者而言是请求,对于服务请求者而言是响应) 时, 将调用或不调用 <program_name> 元素中指定的头程序,具体取决于以下项:
  • <namespace><localname><mandatory> 元素的内容
  • SOAP 头本身的根元素的某些属性的值 (SOAP 的 演员 属性 1.1; SOAP 的 角色 属性 1.2)
以下规则确定在给定情况下是否将调用头程序:
管道配置文件中的 <mandatory> 元素
如果元素包含 true (或 1) ,那么将至少调用一次头处理程序,即使未选择 SOAP 消息中的任何头以供其余规则处理也是如此:
  • 如果未选择任何头块,那么将调用头处理程序一次。
  • 如果其余规则选择了任何头块,那么将对每个所选头调用一次头处理程序。
SOAP 头块中的属性
对于 SOAP 1.1,仅当 actor 属性不存在或具有值 http://schemas.xmlsoap.org/soap/actor/next 时,头块才适合处理
对于 SOAP 1.2,仅当 role 属性不存在或具有下列其中一个值时,头块才适合处理:
  • http://www.w3.org/2003/05/soap-envelope/role/next
  • http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver
除非下一条规则选择了符合处理条件的头块,否则不会对其进行处理。
管道配置文件中的 <namespace><localname> 元素
仅当满足以下条件时,才会选择根据先前规则符合处理条件的头块进行处理:
  • 头块的根元素的名称与管道配置文件中的 <localname> 元素匹配
  • 根元素的名称空间与管道配置文件中的 <namespace> 元素匹配
例如,考虑以下头块:
<t:myheaderblock xmlns:t="http://mynamespace" ...> .... </t:myheaderblock>
根据其他规则,在管道配置文件中编码以下行时,将选择头块进行处理:
<namespace>http://mynamespace</namespace>
<localname>myheaderblock</localname>
<localname> 元素可以包含 * ,以指示应处理名称空间中的所有头块。 因此,通过以下代码选择相同的头块:
<namespace>http://mynamespace</namespace>
<localname>*</localname>

当 SOAP 消息包含多个头时,将对每个匹配的头调用一次头处理程序,但未定义处理头的顺序。

CICS提供的 SOAP 消息处理程序选择在消息处理程序接收消息时根据 SOAP 消息中存在的头块调用的头处理程序。 因此,从不将头处理程序作为添加到同一 SOAP 消息处理程序中的消息的头块的结果来调用。 如果要处理管道中的新头 (或任何已修改的头) ,那么必须在管道中定义另一个 SOAP 消息处理程序。

对于出站消息 (服务请求者中的请求,服务提供者中的响应) , CICS提供的 SOAP 消息处理程序会创建不包含任何头的 SOAP 消息。 为了向消息添加一个或多个头,必须编写头处理程序以添加头。 要确保调用此头处理程序,必须在管道配置文件中定义此头处理程序,并指定 <mandatory>true</mandatory>

如果在管道的请求阶段中调用了头处理程序,那么会在响应阶段中再次调用该头处理程序,即使在响应阶段中流的消息不包含匹配的头也是如此。