0

我正在尝试将 IBM 铸铁与 softlayer SOAP 服务一起使用。走出大门,我得到一个可在此处下载的 softlayer wsdl 的验证错误。氧气 v18 的验证也失败了。在这两种情况下,错误都发生在 wsdl 中的包含规范上:

<xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
  <xsd:include namespace="http://api.service.softlayer.com/soap/v3/"
    schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/>
</xsd:schema>

这就是错误。

cvc-complex-type.3.2.2:属性“命名空间”不允许出现在元素“xsd:include”中。

好的,命名空间不是包含规范的有效属性。很难相信全世界都成功使用的softlayer的wsdl(除了我)是无效的。我删除了命名空间属性,然后我看到无法在元素规范引用 tns:SoftLayer_Account 上解析类型定义。

<xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
  <xsd:complexType name="SoftLayer_AccountObjectMask">
    <xsd:sequence>
      <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>

以及在 wsdl 操作规范的上下文中出现的大量此类错误。

未指定 SOAP 标头的名称空间。当使用被编码时,必须定义命名空间 URI。

这是发生错误的操作之一。

<operation name="addReferralPartnerPaymentOption">
  <soap:operation soapAction="http://api.service.softlayer.com/soap/v3/SoftLayer_AccountAction"/>
  <input>
    <soap:header message="tns:authenticateHeader" part="authenticate" use="encoded"
      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
...

对于上下文,这里是 wsdl 的开始行。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:tns="http://api.service.softlayer.com/soap/v3/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="slApi"
  targetNamespace="http://api.service.softlayer.com/soap/v3/">
  <types>
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
      <xsd:include namespace="http://api.service.softlayer.com/soap/v3/"
        schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/>
    </xsd:schema>
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
      <xsd:complexType name="SoftLayer_AccountObjectMask">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </types>
  <message name="activatePartner">
    <part name="accountId" type="xsd:string"/>
    <part name="hashCode" type="xsd:string"/>
  </message>
...

以及包含的架构的头部,SoftLayer_Account.xsd。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
  xmlns:tns="http://api.service.softlayer.com/soap/v3/"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/"
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="slApi"
  targetNamespace="http://api.service.softlayer.com/soap/v3/">
  <types>
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
      <xsd:include namespace="http://api.service.softlayer.com/soap/v3/"
        schemaLocation="https://api.softlayer.com/soap/v3/SoftLayer_Account?xsd"/>
    </xsd:schema>
    <xsd:schema targetNamespace="http://api.service.softlayer.com/soap/v3/">
      <xsd:complexType name="SoftLayer_AccountObjectMask">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="1" name="mask" type="tns:SoftLayer_Account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:schema>
  </types>
  <message name="activatePartner">
    <part name="accountId" type="xsd:string"/>
    <part name="hashCode" type="xsd:string"/>
  </message>
...

我期待来自 softlayer 的格式良好的 WSDL,而且很可能是这样。只是我在 wsdl 和 xml 的话题上是个白痴,所以对那里的任何帮助表示赞赏!

谢谢,帕克

4

2 回答 2

0

好吧,这不是一个答案,但至少它是一种解决方法。我的解决方案是使用 REST API 来处理使用铸铁而不是 SOAP 的软层服务。

于 2016-07-13T18:58:44.087 回答
0

这很奇怪,softlayer WSDL 可以很好地与 Visual Studio 中的 SOAP UI 或 WSDL.exe 等工具配合使用。您不能从 WSDL 中删除 XSD 引用,否则您会遇到您在帖子中描述的问题。

您可以尝试更改标签,看看是否有效,看看这篇文章XSD with elements from other namespace

无论如何,我认为您面临的问题是由于您使用的工具,而不是由于来自 softlayer 的错误 WSLD。

于 2016-06-28T14:21:49.267 回答