0

我正在使用一个导致我的 SOAP 客户端 (Python SUDS) 出现问题的 WSDL。在开发人员添加<xs:import>到 WSDL 之前,我的 SOAP 客户端正在工作,但现在它阻塞了我的 SOAP 客户端。

奇怪的是,一些命名空间引用了一个不存在的命名空间 URL。即使它没有解决,我也能够在它工作时调用 SOAP 方法。

我的感觉是进口造成了问题。任何人都可以验证此 WSDL 片段是否正确或有效?这个页面让我相信一个schemaLocation属性是必要的,但我什至不知道该放什么。

<wsdl:definitions xmlns:ns1="http://org.apache.axis2/xsd" 
  xmlns:ns="http://sdk.mc.nonexistent.com" xmlns:nsv1="http://v1.sdk.mc.nonexistent.com" 
  xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
  xmlns:mcxsv1="http://v1.sdk.mc.nonexistent.com/xsd" 
  xmlns:mcxs="http://sdk.mc.nonexistent.com/xsd" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
  xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
  targetNamespace="http://sdk.mc.nonexistent.com">

<wsdl:types>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://sdk.mc.nonexistent.com/xsd">
  ...
</xs:schema>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://v1.sdk.mc.nonexistent.com/xsd">
  <xs:import namespace="http://sdk.mc.nonexistent.com/xsd"/>
  <xs:complexType name="MethodFault_v1">
    <xs:choice>
      <xs:element minOccurs="0" name="faultMessage" type="xs:string"/>
      <xs:element minOccurs="0" name="event" type="mcxs:EventMoref"/>
      <xs:element minOccurs="0" name="eventData" type="mcxs:EventData"/>
    </xs:choice>
  </xs:complexType>
...
</xs:schema>
4

1 回答 1

2

您是正确的,导入可能是问题的根源。命名空间通常由看起来像 URL 的字符串组成,尽管它们只是用作唯一的字符串。在 URL 实际解析的地方,它可以帮助解决您在此处遇到的问题,即拉入命名空间中定义的类型。

import 语句的目的是将命名空间与定义命名空间组件的模式文件连接起来。正确的格式是:

<xs:import namespace="http://sdk.mc.nonexistent.com/xsd" schemaLocation="{schema file URL}" />

其中模式文件 URL 可以是与 wsdl 位于同一位置的文件的名称、文件系统路径或可通过网络访问的某个 URL。

如果 WSDL 中没有组件使用这些名称空间的类型,则可以使用对名称空间的引用而不支持定义(模式)的 wsdl。在这种情况下,EventMoref 和 EventData 类型来自缺少的模式,如果没有模式文件,则无法正确使用 WSDL。

如果您可以访问服务提供商,最好的办法是询问丢失模式的位置。

于 2012-05-11T04:04:57.093 回答