WSDL выдает ошибку в Visual Studio 2010. Неверный синтаксис массива? - PullRequest
0 голосов
/ 04 ноября 2011

Я взял на себя поддержку веб-приложения, и оно включает в себя веб-сервис 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 неверен?

1 Ответ

1 голос
/ 04 ноября 2011

Visual Studio говорит вам правду.Вот что говорит XMLSpy:

Файл Untitled1.wsdl недопустим.Недопустимая схема XML: '' tns: getPostsArray 'должна ссылаться на существующий простой или сложный тип.'

...