【问题标题】:Using WSDL to Indicate WS-A Headers使用 WSDL 指示 WS-A 标头
【发布时间】:2013-02-04 19:53:18
【问题描述】:

我正在实现一个基于 SOAP 的 Web 服务并且已经让 WS-Addressing 工作。但是,我看不到如何让 WSDL 发布客户端应该使用的内容作为 wsa:To 元素的值。

我在我的 WSDL 中使用了下面的 sn-p,并使用 SOAP-UI 来生成请求。 SOAP-UI 似乎认识到 wsa:action 应该设置为“http://myco.com/myOperation”,尽管它不会自动添加此标头。我必须选择“添加 WS-A 标头”菜单选项。

我的问题是它没有添加 wsa:To 标头。谁能告诉我如何修改我的 WSDL 以告诉客户 wsa:To 是必需的,并且它的值应该是“http://myco.com/cap/services/v1”?

谢谢

<wsdl:portType name="MyPortType">
    <wsdl:operation name="MyOperation">
        <wsdl:input message="tns:MyRequestMessage" name="Request"
                    wsaw:Action="http://myco.com/myOperation"/>
        <wsdl:output message="tns:MyResponseMessage" name="Response"/>
    </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="MyBinding" type="tns:MyPortType">

    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsaw:UsingAddressing wsdl:required="true"/>
    <wsdl:operation name="MyOperation">
        <soap:operation soapAction="" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>


<wsdl:service name="MyService">
    <wsdl:port binding="tns:MyBinding" name="MyPort">
        <soap:address location="http://myco.com/services"/>
        <wsa:Address>http://myco.com/cap/services/v1</wsa:Address>
    </wsdl:port>
</wsdl:service>

【问题讨论】:

    标签: soap wsdl ws-addressing


    【解决方案1】:

    为了实现这一点,我为 ws 寻址 2005 版本定义了命名空间

    <xs:schema ... xmlns:wsa5="http://www.w3.org/2005/08/addressing">
     ....
    </xs:schema>
    

    消息类型

    <wsdl:message name="wsaHeader">
            <wsdl:part name="MessageID" element="wsa5:MessageID" />
            <wsdl:part name="RelatesTo" element="wsa5:RelatesTo" />
            <wsdl:part name="From" element="wsa5:From" />
            <wsdl:part name="ReplyTo" element="wsa5:ReplyTo" />
            <wsdl:part name="FaultTo" element="wsa5:FaultTo" />
            <wsdl:part name="To" element="wsa5:To" />
            <wsdl:part name="Action" element="wsa5:Action" />
    </wsdl:message>
    

    然后在我的输入和输出中我放置了以下标签。

    <wsdl:input>
        <soap:header use="literal" message="tns:wsaHeader" part="Action"/>
        <soap:header use="literal" message="tns:wsaHeader" part="To"/>
        <soap:header use="literal" message="tns:wsaHeader" part="FaultTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="ReplyTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="From"/>
        <soap:header use="literal" message="tns:wsaHeader" part="RelatesTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="MessageID"/>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:header use="literal" message="tns:wsaHeader" part="Action"/>
        <soap:header use="literal" message="tns:wsaHeader" part="To"/>
        <soap:header use="literal" message="tns:wsaHeader" part="FaultTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="ReplyTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="From"/>
        <soap:header use="literal" message="tns:wsaHeader" part="RelatesTo"/>
        <soap:header use="literal" message="tns:wsaHeader" part="MessageID"/>
        <soap:body use="literal" />
      </wsdl:output> 
    

    您可能只需要添加To 标记即可。

    【讨论】:

    • Paul 我想弄清楚 message="tsn:wsaHeader" 中的“tns”是什么。我没有看到您设置了命名空间,我不认为它是在 WS-Addressing 定义中设置的,并且您将消息定义为“wsaHeader”,因此您似乎应该在输入和输出中引用它项目。
    • 我在w3.org/Submission/ws-addressing 看到了一个使用 tns 的示例,所以我认为它的意思是 targetNamespace 但不知道为什么你必须明确地调用它。
    • 您好,很抱歉延迟回复。我对WSDL的了解非常有限,所以很遗憾我不能给你一个权威的答案。我的理解是,是的 tnstargetNamespace 是同一个东西,它通常用于指代您设置的命名空间,以引用您自己的所有类型、端口、绑定等。可能更简单且更易于维护做这件事的方法比我的答案,但是因为这解决了我的问题,我想我会发布它。如果您找到更好的方法,请发布另一个答案。
    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2011-02-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多