Ошибка при использовании RPC/ закодированной веб-службы SOAP в.NET

Я получаю следующую ошибку при вызове метода веб-службы.

Невозможно назначить объект типа System.Xml.XmlNode[] объекту типа System.String.

Веб-сервис - это сервис PHP. Я создал свой прокси-класс с помощью wsdl.exe из документа wsdl, определенного здесь - http://webservice.intelecast.com.au/traffic/PublicSoap/server.php?wsdl

Ниже приведен метод прокси-клиента, который я вызываю.

[System.Web.Services.Protocols.SoapRpcMethodAttribute("http://webservice.intelecast.com.au/traffic/PublicSoap/server.php#getAllTraffic", RequestNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php", ResponseNamespace="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php")]
 [return: System.Xml.Serialization.SoapElementAttribute("return")]
 public TmcInfo[] getAllTmcTraffic(string[] States, int[] EventCodes) {
     object[] results = this.Invoke("getAllTmcTraffic", new object[] { //Error here
                 States,
                 EventCodes});

Похоже, что прокси-класс не в состоянии справиться со сложными типами / массивами, определенными в wsdl... Я не уверен, как действовать дальше, нигде не могу найти решения в Интернете.

Ниже приведен ответ SOAP, который я получаю. Это все кажется действительным.

<?xml version="1.0" encoding="iso-8859-1"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
       xmlns:tns="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php">
    <SOAP-ENV:Body>
        <ns1:getAllTrafficResponse 
            xmlns:ns1="http://webservice.intelecast.com.au/traffic/PublicSoap/server.php">
            <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:TrafficInfo[2]">
                <item xsi:type="tns:TrafficInfo">
                    <id xsi:type="xsd:string">1245632068110</id>
                    <entryDate xsi:type="xsd:datetime">22/06/2009 10:54:28</entryDate>
                    <direction xsi:type="xsd:int">0</direction>
                    <extent xsi:type="xsd:int">1</extent>
                    <locationCode xsi:type="xsd:int">31593</locationCode>
                    <countryCode xsi:type="xsd:int">4</countryCode>
                    <ltn xsi:type="xsd:int">56</ltn>
                    <diversionAdvice xsi:type="xsd:int">0</diversionAdvice>
                    <slAdvice xsi:type="xsd:int">0</slAdvice>
                    <quantifier xsi:type="xsd:int">0</quantifier>
                    <suppInfoCode xsi:type="xsd:int">0</suppInfoCode>
                    <addEvent xsi:type="xsd:int">0</addEvent>
                    <detDivAdvice xsi:type="xsd:int">0</detDivAdvice>
                    <destinations xsi:type="xsd:int">0</destinations>
                    <clSourceProblem xsi:type="xsd:int">0</clSourceProblem>
                    <eventCode xsi:type="xsd:int">802</eventCode>
                    <timeInfo xsi:type="tns:TimeInfo">
                        <start xsi:type="xsd:string">21/06/2009 14:00:00</start>
                        <finish xsi:type="xsd:string">05/11/2009 14:00:00</finish>
                        <timeZone xsi:type="xsd:string">Australia/Brisbane</timeZone>
                    </timeInfo>
                    <location xsi:type="tns:Point">
                        <lat xsi:type="xsd:float">-27.3112692120521</lat>
                        <lon xsi:type="xsd:float">153.029100894928</lon>
                    </location>
                    <additionalStreetInfo 
                      xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:AdditionalStreetInfo[1]">
                        <item xsi:type="tns:AdditionalStreetInfo">
                            <street xsi:type="xsd:string">Bracken Ridge Rd</street>
                            <type xsi:type="xsd:string">CROSS</type>
                        </item>
                    </additionalStreetInfo>
                    <address xsi:type="tns:Address">
                        <streetNumber xsi:type="xsd:string"/>
                        <streetName xsi:type="xsd:string">Bracken Ridge Rd</streetName>
                        <suburb xsi:type="xsd:string">Bracken Ridge</suburb>
                        <state xsi:type="xsd:string">QLD</state>
                    </address>
                </item>
                <item xsi:type="tns:TrafficInfo">
                    <id xsi:type="xsd:string">1245632111995</id>
                    <entryDate xsi:type="xsd:datetime">22/06/2009 10:55:11</entryDate>
                    <direction xsi:type="xsd:int">1</direction>
                    <extent xsi:type="xsd:int">1</extent>
                    <locationCode xsi:type="xsd:int">31592</locationCode>
                    <countryCode xsi:type="xsd:int">4</countryCode>
                    <ltn xsi:type="xsd:int">56</ltn>
                    <diversionAdvice xsi:type="xsd:int">0</diversionAdvice>
                    <slAdvice xsi:type="xsd:int">0</slAdvice>
                    <quantifier xsi:type="xsd:int">0</quantifier>
                    <suppInfoCode xsi:type="xsd:int">0</suppInfoCode>
                    <addEvent xsi:type="xsd:int">0</addEvent>
                    <detDivAdvice xsi:type="xsd:int">0</detDivAdvice>
                    <destinations xsi:type="xsd:int">0</destinations>
                    <clSourceProblem xsi:type="xsd:int">0</clSourceProblem>
                    <eventCode xsi:type="xsd:int">802</eventCode>
                    <timeInfo xsi:type="tns:TimeInfo">
                        <start xsi:type="xsd:string">21/06/2009 14:00:00</start>
                        <finish xsi:type="xsd:string">05/11/2009 14:00:00</finish>
                        <timeZone xsi:type="xsd:string">Australia/Brisbane</timeZone>
                    </timeInfo>
                    <location xsi:type="tns:Point">
                        <lat xsi:type="xsd:float">-27.3125370752656</lat>
                        <lon xsi:type="xsd:float">153.042898178101</lon>
                    </location>
                    <additionalStreetInfo 
                       xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:AdditionalStreetInfo[1]">
                        <item xsi:type="tns:AdditionalStreetInfo">
                            <street xsi:type="xsd:string">Bracken Ridge Rd</street>
                            <type xsi:type="xsd:string">CROSS</type>
                        </item>
                    </additionalStreetInfo>
                    <address xsi:type="tns:Address">
                        <streetNumber xsi:type="xsd:string"/>
                        <streetName xsi:type="xsd:string">Bracken Ridge Rd</streetName>
                        <suburb xsi:type="xsd:string">Bracken Ridge</suburb>
                        <state xsi:type="xsd:string">QLD</state>
                    </address>
                </item>
            </return>
        </ns1:getAllTrafficResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

2 ответа

Это ошибка в wsdl.exe? У меня есть несколько неприятных встреч с wsdl.exe. Вот проблемы, изложенные в моем посте:

Первая проблема - не удается обработать последовательность со сложным элементом. Можно подумать, что в современной среде веб-сервисов последовательность сложных элементов является нормой. Но, видимо, Microsoft так не считает, и это приводит к неспособности wsdl.exe обрабатывать последовательность сложных элементов.

Что если вы настаиваете на использовании wsdl.exe для создания прокси-класса для элемента с последовательностью сложных типов? Вы получите загадочное исключение: невозможно импортировать привязку * из пространства имен * - невозможно импортировать операцию * - тип данных * отсутствует Вторая ошибка, которую имеет wsdl, заключается в том, что недопустимо иметь два веб-метода с одинаковой возвращаемой сигнатурой. Да, если один метод возвращает тип ComplexType, другие методы должны иметь другой тип возвращаемого значения. Невыполнение этого требования приведет к исключению System.InvalidOperationException: элемент XML * из пространства имен * ссылается на метод и исключение типа.

Обратите внимание, что в обоих случаях сообщения являются загадочными. Вы на самом деле не будете знать, что происходит за капотом. И это самое неприятное из всех. Вы не знаете, потерпели ли вы неудачу, потому что инструмент паршивый, или потому что вы не все делаете правильно.

Может быть, вы можете обратиться к этому сообщению для альтернативы wsdl.exe.

Стоит отметить, что реализация SOAP в rpc/encoded имеет проблемы со сложными типами. Одним из способов решения этой проблемы является преобразование WSDL в формат Document/Literal.

Другие вопросы по тегам