我有一个包含自定义标头的基于肥皂的 Web 服务的 WSDL:
<message name="Request">
<part element="common:Request" name="Request"></part>
<part element="common:myHeader" name="Header"></part>
</message>
<operation name="processRequest">
<soap:operation soapAction=""/>
<input>
<soap:body parts="Request" use="literal"/>
<soap:header message="tns:Request" part="Header" use="literal"></soap:header>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
标头类型在单独的模式文件中定义:
<xs:element name="myHeader" nillable="false" type="tns:myHeaderType"/>
<xs:complexType name="myHeaderType">
<xs:sequence minOccurs="1" maxOccurs="1">
<xs:element name="JobID" type="tns:JobIDType" minOccurs="1" maxOccurs="1"/>
<xs:element name="TransactionID" type="xs:string" minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
此外,我正在验证 的定义,myHeaderType
以确保所需的元素在那里,满足格式约束等。这一切似乎都正常工作,因为格式正确的请求被接受,格式不正确的请求被拒绝。
我的问题出现在使用 Apache Axis(隐藏在专有工具后面)生成 Web 服务客户端的消费者身上。正如此处的另一个 StackOverflow 问题中所述,Axis 在 myHeader 上插入了 SOAP 标准允许的一些可选属性(据我所知):
<soapenv:Header>
<com:myHeader soapenv:mustUnderstand="0" soapenv:actor="">
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
<JobID>myJobId</JobID>
<TransactionID>myTransactionId</TransactionID>
</com:myHeader>
</soapenv:Header>
由于我的消费者正在使用的工具,修改 Axis 生成的存根以忽略这些属性是不可行的,正如其他地方所建议的那样。此外,如果我要声称自己是肥皂服务,我的服务似乎应该允许这些属性。我的问题是,如何修改我的标题定义以适应这些可选属性,并在理想情况下规划我可能没有预料到的属性。是否有可以为我的标头类型定义扩展的标准类型,或者这种情况的一般最佳实践?