头处理程序

报头处理程序是由用户编写的 CICS® 程序,与 CICS 提供的SOAP 1.1 和SOAP 1.2 消息处理程序链接,用于处理SOAP报头块。 您可以使用 CICS 支持的任何语言编写头处理程序,并使用 DPL 子集中的任何 CICS 命令。 您的标题处理程序可以链接到其他 CICS 程序。

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

报头处理程序有一个通道接口(请参阅 报头处理程序接口);容器中保存着报头处理程序可以检查或修改的信息,包括调用该程序的 SOAP 报头块和 SOAP 消息体。 其他容器包含有关在其中调用头程序的环境的信息,例如:
  • 调用头文件的事务 ID。
  • 程序是针对服务提供者还是请求者管道调用的。
  • 正在处理的报文是请求还是回复。

标题处理程序容器中描述了标题处理程序可以使用的通道和容器。

如何为 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 的 actor 属性;SOAP 1.2 的 role 属性)。
以下规则决定在特定情况下是否调用头文件程序:
管道配置文件中的 <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>

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