我必须创建一个.NET Web服务客户端,它连接Java AXIS Web服务。 我的问题与以下事实有关:当调用WS时,这会返回一个包含256个元素的数组(这是正确的),但每个元素的属性都有空值。
wsdl如下:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://service.sms.mycompany.eu"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://service.sms.mycompany.eu"
xmlns:intf="http://service.sms.mycompany.eu"
**xmlns:tns1="http://model.sms.mycompany.eu"**
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified"
targetNamespace="http://service.sms.mycompany.eu"
xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://model.sms.mycompany.eu"/>
<element name="getCountries">
<complexType/>
</element>
<element name="getCountriesResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="getCountriesReturn" type="**tns1:Country**"/>
</sequence>
</complexType>
</element>
</schema>
<schema elementFormDefault="qualified"
targetNamespace="http://model.sms.mycompany.eu"
xmlns="http://www.w3.org/2001/XMLSchema">
<complexType name="Country">
<sequence>
<element name="description" nillable="true" type="xsd:string"/>
<element name="id" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getCountriesRequest">
<wsdl:part element="impl:getCountries" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:message name="getCountriesResponse">
<wsdl:part element="impl:getCountriesResponse" name="parameters"></wsdl:part>
</wsdl:message>
<wsdl:operation name="getCountries">
<wsdl:input message="impl:getCountriesRequest" name="getCountriesRequest"></wsdl:input>
<wsdl:output message="impl:getCountriesResponse" name="getCountriesResponse"></wsdl:output>
</wsdl:operation>
<wsdl:portType name="SapServiceOut">
<wsdl:operation name="getCountries">
<wsdl:input message="impl:getCountriesRequest" name="getCountriesRequest">
</wsdl:input>
<wsdl:output message="impl:getCountriesResponse" name="getCountriesResponse"></wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SapServiceOutSoapBinding" type="impl:SapServiceOut">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getCountries">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCountriesRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCountriesResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SapServiceOutService">
<wsdl:port binding="impl:SapServiceOutSoapBinding" name="SapServiceOut">
<wsdlsoap:address location="http://localhost:8080/XBP/services/SapServiceOut"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
我已经使用SoapUI测试了服务,结果是
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
**<getCountriesResponse xmlns="http://service.sms.mycompany.eu">**
<getCountriesReturn>
<description>Afghanistan</description>
<id>AF</id>
</getCountriesReturn>
<getCountriesReturn>
<description>Antigua/Barbuda</description>
<id>AG</id>
</getCountriesReturn>
...
</getCountriesResponse>
</soapenv:Body>
</soapenv:Envelope>
我已经看到两个名称空间之间存在差异(包含在**之间),但我仍然不明白如何更正WSDL以使其工作。
有人可以正确的方式对我说话吗? 非常感谢
答案 0 :(得分:1)
在响应中,所有对象都在同一个模式上,但在wsdl中,您使用另一个名称空间的类型定义 getCountriesReturn 。您可以修改它,更改您的wsdl以在http://service.sms.mycompany.eu架构中包含 Country 类型:
<wsdl:definitions targetNamespace="http://service.sms.mycompany.eu"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
xmlns:impl="http://service.sms.mycompany.eu"
xmlns:intf="http://service.sms.mycompany.eu"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<!--WSDL created by Apache Axis version: 1.4 Built on Apr 22, 2006 (06:55:48 PDT)-->
<wsdl:types>
<schema elementFormDefault="qualified"
targetNamespace="http://service.sms.mycompany.eu"
xmlns="http://www.w3.org/2001/XMLSchema">
<element name="getCountries">
<complexType/>
</element>
<element name="getCountriesResponse">
<complexType>
<sequence>
<element maxOccurs="unbounded" name="getCountriesReturn" type="Country"/>
</sequence>
</complexType>
</element>
<complexType name="Country">
<sequence>
<element name="description" nillable="true" type="xsd:string"/>
<element name="id" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
</schema>
</wsdl:types>
<wsdl:message name="getCountriesRequest">
<wsdl:part element="impl:getCountries" name="parameters"/>
</wsdl:message>
<wsdl:message name="getCountriesResponse">
<wsdl:part element="impl:getCountriesResponse" name="parameters"/>
</wsdl:message>
<wsdl:operation name="getCountries">
<wsdl:input message="impl:getCountriesRequest" name="getCountriesRequest"/>
<wsdl:output message="impl:getCountriesResponse" name="getCountriesResponse"/>
</wsdl:operation>
<wsdl:portType name="SapServiceOut">
<wsdl:operation name="getCountries">
<wsdl:input message="impl:getCountriesRequest" name="getCountriesRequest">
</wsdl:input>
<wsdl:output message="impl:getCountriesResponse" name="getCountriesResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SapServiceOutSoapBinding" type="impl:SapServiceOut">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getCountries">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="getCountriesRequest">
<wsdlsoap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getCountriesResponse">
<wsdlsoap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SapServiceOutService">
<wsdl:port binding="impl:SapServiceOutSoapBinding" name="SapServiceOut">
<wsdlsoap:address location="http://localhost:8080/XBP/services/SapServiceOut"/>
</wsdl:port>
</wsdl:service>