2009-09-02 11 views
5

Tengo algunos problemas importantes al tratar de consumir mi servicio web PHP SOAP usando ASP.NET. El servicio web en cuestión se basa en la extensión PHP SOAP y se lo expuesto por la siguiente WSDL:Consumo de un SOAP WebService de PHP con 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> 

que puede generar con éxito una clase de proxy de esta WSDL en Visual Studio, pero al intentar invocar el método getServices soy se presenta con una excepción:

System.Web.Services.Protocols.SoapHeaderException: Procedimiento 'cadena' no presentar

Después de inspeccionar los datos de envío primas en el extremo servidor SOAP, mi cliente PHP SOAP es hacer peticiones como este:

<?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> 

Mientras que la clase de proxy .Net está haciendo esto:

<?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> 

sólo puedo asumir que la diferencia en la forma en que se envía el parámetro de código postal es donde radica el problema, pero principalmente como un desarrollador de PHP No sé qué está pasando aquí. Tengo la sensación de que simplemente me estoy perdiendo algo vital en mi WSDL ya que he visto innumerables ejemplos de 'Consuming PHP SOAP WebServices con .Net' que parecen sugerir que 'simplemente funciona'.

Cualquier sugerencia sobre dónde me he escapado aquí sería muy apreciada. Actualmente He pasado casi un día entero en este ahora ;-)

Gracias de antemano,

Jamie

+0

Es fácil equivocarse ... en SOAP :-D – andychase

Respuesta

1

este momento para hacer una respuesta en lugar de un comentario de que no tienen suficiente reputación de que aún ...

Debería intentar probar su servicio web con SOAP-UI (tienen una versión gratuita), para que sepa si el problema es del lado del cliente o del servidor.

0

WSDL tiene errores, por lo tanto, muy probablemente la clase de proxy está dañada. Así que es la solicitud.
WSDL es muy complejo de hacer bien a menos que utilice un buen editor WSDL. Sugeriría el editor WSDL de Eclipse (http://wiki.eclipse.org/index.php/Introduction_to_the_WSDL_Editor)

(1) El {max ocurre} de un elemento en un grupo de modelos 'todos' debe ser 0 o 1. El valor '-1' para el elemento 'Servicios' no es válido.
(2) Error al resolver el componente 'ServiceType'. Se detectó que 'ServiceType' está en el espacio de nombres 'http://www.w3.org/2001/XMLSchema', pero los componentes de este espacio de nombres no son referenciables desde el documento de esquema