2009-09-02 11 views
5

Mam kilka poważnych problemów próbujących skonsumować moją usługę PHP SOAP za pomocą ASP.NET. Webservice w pytaniu jest na podstawie rozszerzenia PHP SOAP i descibed następującym WSDL:Zużywający WebService PHP SOAP z ASP.NET

<?xml version="1.0" encoding="UTF-8" ?> 
<definitions name="MyServices" 
    targetNamespace="http://mydomain.com/api/soap/v11/services" 
    xmlns:tns="http://mydomain.com/api/soap/v11/services" 
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsd1="http://mydomain.com/api/soap/v11/services" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns="http://schemas.xmlsoap.org/wsdl/"> 

<types> 
    <schema targetNamespace="http://mydomain.com/api/soap/v11/services" xmlns="http://www.w3.org/2001/XMLSchema"> 
     <complexType name="ServiceType"> 
      <all> 
       <element name="id" type="xsd:int" minOccurs="1" maxOccurs="1" /> 
       <element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" /> 
       <element name="cost" type="xsd:float" minOccurs="1" maxOccurs="1" /> 
      </all> 
     </complexType> 
     <complexType name="ArrayOfServiceType"> 
      <all> 
       <element name="Services" type="ServiceType" minOccurs="0" maxOccurs="unbounded" /> 
      </all> 
     </complexType> 
    </schema> 
</types> 


<message name="getServicesRequest"> 
    <part name="postcode" type="xsd:string" /> 
</message> 

<message name="getServicesResponse"> 
    <part name="Result" type="xsd1:ArrayOfServiceType"/> 
</message> 

<portType name="ServicesPortType"> 
    <operation name="getServices"> 
    <input message="tns:getServicesRequest"/> 
    <output message="tns:getServicesResponse"/> 
    </operation> 
</portType> 

<binding name="ServicesBinding" type="tns:ServicesPortType"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <operation name="getServices"> 
    <soap:operation soapAction="http://mydomain.com/api/soap/v11/services/getServices" /> 
    <input> 
     <soap:body use="encoded" namespace="urn:my:services" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
    </input> 
    <output> 
     <soap:body use="encoded" namespace="urn:my:services" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
    </output> 
    </operation> 
</binding> 

<service name="MyServices"> 
    <port name="ServicesPort" binding="tns:ServicesBinding"> 
    <soap:address location="http://mydomain.com/api/soap/v11/services"/> 
    </port> 
</service> 
</definitions> 

mogę skutecznie wygenerowania klasy proxy z tym WSDL w Visual Studio, ale po próbuje wywołać metodę getServices jestem przedstawiane z wyjątkiem:

System.Web.Services.Protocols.SoapHeaderException: Procedura „string” nie prezentujemy

Po zbadaniu surowych danych post na koniec serwera SOAP, mój klient PHP SOAP jest zlecania w ten sposób:

<?xml version="1.0" encoding="UTF-8"?> 
<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/" 
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
    <SOAP-ENV:Body> 
     <postcode xsi:type="xsd:string">ln4 4nq</postcode> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Zważywszy klasy proxy NET to w ten sposób:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:tns="http://mydomain.com/api/soap/v11/services" 
    xmlns:types="http://mydomain.com/api/soap/v11/services/encodedTypes" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
     <xsd:string xsi:type="xsd:string">LN4 4NQ</xsd:string> 
    </soap:Body> 
</soap:Envelope> 

mogę tylko przypuszczać różnicę w sposobie parametr kod pocztowy jest wysłanego gdzie leży problem, ale przede wszystkim jako programista PHP Nie mam pojęcia, co tu się dzieje. Mam wrażenie, że po prostu brakuje mi czegoś istotnego w moim WSDL, ponieważ widziałem niezliczone przykłady "Consuming PHP SOAP WebServices with .Net", które sugerują, że "po prostu działa".

Wszelkie sugestie dotyczące miejsca, w którym się tu znalazłem, byłyby bardzo mile widziane. Mam obecnie spędził prawie cały dzień na to teraz ;-)

Dzięki z góry,

Jamie

+0

Łatwo jest zrzucić ... na SOAP :-D – andychase

Odpowiedz

1

Niestety, aby odpowiedź zamiast komentarzem nie mam wystarczająco dużo reputację to jeszcze ...

Powinieneś spróbować przetestować swój serwis z SOAP-UI (mają darmową wersję), więc będziesz wiedzieć, czy problem jest po stronie klienta, czy po stronie serwera.

0

WSDL zawiera błędy, dlatego najprawdopodobniej klasa proxy jest uszkodzona. Tak samo jest z prośbą.
WSDL jest bardzo złożony, aby zrobić to dobrze, chyba że używasz dobrego edytora WSDL. Sugerowałbym edytor Eclipse WSDL (http://wiki.eclipse.org/index.php/Introduction_to_the_WSDL_Editor)

(1) Element {max występuje} elementu w grupie modelu "wszystkie" musi mieć wartość 0 lub 1. Wartość "-1" dla elementu "Usługi" jest nieprawidłowa.
(2) Błąd podczas rozwiązywania składnika "ServiceType". Wykryto, że "ServiceType" znajduje się w obszarze nazw "http://www.w3.org/2001/XMLSchema", ale komponenty z tej przestrzeni nazw nie mogą się odwoływać do dokumentu schematu

Powiązane problemy