2010-01-01 2 views
0

Мне нужно подключиться к PHP WebService через SOAP из приложения .NET (C#, WPF). Я добавил ссылку на эту службу, некоторые прокси были созданы.SOAP: PHP WebService и .Net

Когда я ссылаться некоторые функции:

var client = new someAPIPortTypeClient(); 
XmlNode[] response = client.status(arg1, arg2);  

я получил ответ:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:nakopitel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <ns1:statusResponse> 
     <statusReturn xsi:type="ns2:Map"> 
      <item> 
       <key xsi:type="xsd:string">is_active</key> 
       <value xsi:type="xsd:boolean">true</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">allow_add_paid</key> 
       <value xsi:type="xsd:boolean">false</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">allow_search_free</key> 
       <value xsi:type="xsd:boolean">true</value> 
      </item> 
      <item> 
       <key xsi:type="xsd:string">allow_add_free</key> 
       <value xsi:type="xsd:boolean">true</value> 
      </item> 
     </statusReturn> 
     </ns1:statusResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Это интерпретируется как XmlNode[] ...

Как я могу получить нормальные прокси-классы для работы с это SOAP-сервис? Я могу попросить автора службы что-то изменить, если это потребуется.

Обновление. WSDL для функции статуса.

<?xml version='1.0' encoding='UTF-8'?> 

<definitions name="something" targetNamespace="urn:something" xmlns:typens="urn:something" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> 
    <message name="status"> 
    <part name="terminal" type="xsd:integer"/> 
    <part name="code" type="xsd:string"/> 
    </message> 
    <message name="statusResponse"> 
    <part name="statusReturn" type="xsd:anyType"/> 
    </message> 
    <portType name="someAPIPortType"> 
    <operation name="status"> 
     <documentation> 
     Get status 
     </documentation> 
     <input message="typens:status"/> 
     <output message="typens:statusResponse"/> 
    </operation> 
    </portType> 
    <binding name="someAPIBinding" type="typens:someAPIPortType"> 
    <operation name="status"> 
     <soap:operation soapAction="urn:someAPIAction"/> 
     <input> 
     <soap:body namespace="urn:something" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     </input> 
     <output> 
     <soap:body namespace="urn:something" use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/> 
     </output> 
    </operation> 
    </binding> 
    <service name="somethingService"> 
    <port name="someAPIPort" binding="typens:someAPIBinding"> 
     <soap:address location="http://something/soap/"/> 
    </port> 
    </service> 
</definitions> 
+0

wsdl выглядит «хорошо»? я бы поспорил, что wsdl имеет что-то вроде xsd: любое или что-то в этом роде ... вы, вероятно, могли бы просто написать свой собственный wsdl, если человек на другом конце не знает, как «исправить» wsdl, который они вам дали. – dovholuk

+0

Я думаю, вы правы, thx. Я добавил фрагмент файла WSDL в текст вопроса. Знаете ли вы, как исправить это лучший (или/или самый простой) способ? Это мой первый раз, когда я должен работать с SOAP. – aks

ответ

2

Чтобы сделать длинную историю короткой, если вы хотите, чтобы все работало так, как вы хотите их, вы должны определить правильный WSDL. XSD_ANY просто прошу о неисправности.

+0

Yeap, я это уже понял. Например, я могу создать SOAP-сервис в MS Visual Studio и использовать сгенерированный файл WSDL в php-сервисе ... Это одно из простейших решений). – aks

Смежные вопросы