Я взял на себя поддержку веб-приложения, и оно включает в себя веб-сервис SOAP.Мыльный сервер написан на PHP с использованием SoapServer (http://php.net/manual/en/soapserver.soapserver.php)) и корректно работает с PHP в качестве мыльного клиента. Но сейчас я пытаюсь использовать WSDL в Visual Studio 2010, и хотя Visual Studio может видеть все методы, определенные вWSDL, когда я прикрепил веб-ссылку, приложение .Net выдает ошибку при попытке компиляции. Выдается следующее сообщение об ошибке:
Ошибка пользовательского инструмента: Невозможно импортировать WebServiceSchema. Невозможно импортироватьпривязка 'ApolloSoap' из пространства имен 'http://clientdomain/soap/export'. Невозможно импортировать операцию' getPosts '. Отсутствует тип данных' http://clientdomain/soap/export/:getPostsArray'.
Я опубликую источник документа WSDL (обратите внимание, что я сократил источникпотому что это ОГРОМНО. Я вынул все, что относится к другим методам в WSDL, чтобы попытаться сосредоточиться на методе, о котором сообщается в сообщении об ошибке.)
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://clientdomain/soap/export/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://clientdomain/soap/export/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema targetNamespace="http://clientdomain/soap/export/" elementFormDefault="qualified">
<s:import namespace="http://microsoft.com/wsdl/types/"/>
<s:element name="post">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Reference" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Technician" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Customer" type="s:string"/>
<s:element minOccurs="1" maxOccurs="1" name="Address" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getPosts">
<s:complexType>
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="authorisationcode" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getPostsResponse">
<s:complexType>
<s:sequence>
<s:element name="getPostsArray" type="tns:getPostsArray"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getPostsArray">
<s:complexType>
<s:complexContent>
<s:restriction base="soapenc:Array">
<s:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:post[]"/>
</s:restriction>
</s:complexContent>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="getPostsSoapIn">
<wsdl:part name="parameters" element="tns:getPosts"/>
</wsdl:message>
<wsdl:message name="getPostsSoapOut">
<wsdl:part name="parameters" element="tns:getPostsResponse"/>
</wsdl:message>
<wsdl:portType name="ApolloSoap">
<wsdl:operation name="getPosts">
<wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'>
Function ("getPosts")
</wsdl:documentation>
<wsdl:input message="tns:getPostsSoapIn"/>
<wsdl:output message="tns:getPostsSoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:portType name="ApolloSoap12">
<wsdl:operation name="getPosts">
<wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'>
Function ("getPosts")
</wsdl:documentation>
<wsdl:input message="tns:getPostsSoapIn"/>
<wsdl:output message="tns:getPostsSoapOut"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="ApolloSoap" type="tns:ApolloSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getPosts">
<soap:operation soapAction="http://clientdomain/soap/export/getPosts" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:binding name="ApolloSoap12" type="tns:ApolloSoap12">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getPosts">
<soap12:operation soapAction="http://clientdomain/soap/export/getPosts" style="document"/>
<wsdl:input>
<soap12:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap12:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="wService">
<wsdl:port name="ApolloSoap" binding="tns:ApolloSoap">
<soap:address location="http://clientdomain//web/_soap/server.php?pmoaEyLb3BvW0Vwc3jf="/>
</wsdl:port>
<wsdl:port name="ApolloSoap12" binding="tns:ApolloSoap12">
<soap12:address location="http://clientdomain//web/_soap/server.php?pmoaEyLb3BvW0Vwc3jf="/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Может кто-нибудь помочь мне разобраться в чем делос этим документом WSDL и почему .Net не видит определения getPostsArray , несмотря наФакт, что это определено в разделе типов документа?
ОБНОВЛЕНИЕ:
У меня есть подозрение, что строки, вызывающие проблему для Visual Studio, следующие:
<s:restriction base="soapenc:Array">
<s:attribute ref="soapenc:arrayType" wsdl:arrayType="tns:post[]"/>
</s:restriction>
Я подозреваю, что эти строки, потому что, когда я создаю простуювеб-службы в Visual Studio Я вижу, что сгенерированный код для массива выглядит следующим образом:
<s:complexType name="ArrayOfPost">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Post" nillable="true" type="tns:Post" />
</s:sequence>
</s:complexType>
Может кто-нибудь объяснить эти два различных способа определения массива сложного типа и подтвердить / опровергнуть, что синтаксис вмой документ WSDL неверен?