头处理程序
报头处理程序是由用户编写的 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时,头块才适合处理 - 管道配置文件中的
<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>。
如果在管道的请求阶段中调用了头处理程序,那么会在响应阶段中再次调用该头处理程序,即使在响应阶段中流的消息不包含匹配的头也是如此。