2010-04-13 15 views
5

Tengo un servicio web (fuera de mi control) con el que tengo que hablar. También tengo un sniffer de paquetes en la línea, y los desarrolladores del servicio web no mienten. Veo datos en los campos correctos.¿Por qué un WebService devuelve nulos cuando el servicio real devuelve datos?

En realidad, están devolviendo todos los datos que solicité. Pero el código del servicio web que se genera automáticamente a partir del archivo WSDL me da "nulo" como valor.

ACTUALIZACIÓN: Para aclaración, el objeto devuelto NO es nulo. Los elementos dentro del objeto son nulos. No sé si eso ayudará a alguien o no. Estoy totalmente perplejo.

Utilicé su archivo WSDL para generar mi referencia web. Revisé mis tipos de datos con los tipos de datos que ha declarado el archivo WSDL. Y utilicé el código como se enumera a continuación para realizar las llamadas:

DT_MaterialMaster_LookupRequest req = new DT_MaterialMaster_LookupRequest(); 
req.MaterialNumber = "101*"; 
req.DocumentNo = ""; 
req.Description = "Pipe*"; 
req.Plant = "0000"; 

MI_MaterialMaster_Lookup_OBService srv = new MI_MaterialMaster_Lookup_OBService(); 

DT_MaterialMaster_Response resp = 
    srv.MI_MaterialMaster_Lookup_OB(new DT_MaterialMaster_LookupRequest[] { req }); 


// Note that the response here is ALWAYS null!! 
Console.WriteLine(resp.Status); 

El objeto resp es un objeto real. Fue generado correctamente Sin embargo, los campos Estado y MaterialData son siempre nulos.

Cuando llamo el servicio web, he colocado un paquete-sniffer en la línea, y puedo ver que he enviado los siguientes (los saltos de línea y sangrías para mi propia cordura):

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
    <MT_MaterialMaster_Lookup 
     xmlns="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch"> 
     <Request xmlns=""> 
      <MaterialNumber>101*</MaterialNumber> 
      <Description>Pipe*</Description> 
      <DocumentNo /> 
      <Plant>0000</Plant> 
     </Request> 
    </MT_MaterialMaster_Lookup> 
</soap:Body> 
</soap:Envelope> 

la respuesta que devuelven parece ser una respuesta válida (saltos de línea y sangrías para mi propia cordura):

<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'> 
<SOAP:Header /> 
    <SOAP:Body> 
     <n0:MT_MaterialMaster_Response 
      xmlns:n0='http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch' 
      xmlns:prx='urn:SomeCompany.com:proxy:BRD:/1SAI/TAS4FE14A2DE960D61219AE:701:2009/02/10'> 
     <Response> 
      <Status>No Rows Found</Status> 
      <MaterialData /> 
     </Response> 
    </n0:MT_MaterialMaster_Response> 
</SOAP:Body> 
</SOAP:Envelope> 

el estado muestra que lo que realmente reciben los datos ... pero el resp.Status y resp.MaterialData los campos son siempre nulos. ¿Qué he hecho mal?

ACTUALIZACIÓN: El archivo WSDL se define como:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:p1="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" name="MI_MaterialMaster_Lookup_OB" targetNamespace="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <xsd:schema xmlns="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" 
     targetNamespace="http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <xsd:element name="MT_MaterialMaster_Response" type="p1:DT_MaterialMaster_Response" /> 
     <xsd:element name="MT_MaterialMaster_Lookup" type="p1:DT_MaterialMaster_Lookup" /> 
     <xsd:complexType name="DT_MaterialMaster_Response"> 
    <xsd:sequence> 
     <xsd:element name="Status" type="xsd:string"> 
     <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b040af11df99e300145eccb24e</xsd:appinfo> 
     </xsd:annotation> 
     </xsd:element> 
     <xsd:element maxOccurs="unbounded" name="MaterialData"> 
     <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa040a511df843700145eccb24e</xsd:appinfo> 
     </xsd:annotation> 
     <xsd:complexType> 
      <xsd:sequence> 
     <xsd:element name="MaterialNumber" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa140a511df848500145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Description" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa240a511df95bf00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="DocumentNo" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa340a511dfb23700145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="UOM" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">3b5f14c040a611df9fbe00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Hierarchy" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa440a511dfc65b00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Plant" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b140af11dfb78e00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Procurement" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">d48d03b240af11dfb87b00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
     </xsd:complexType> 
     <xsd:complexType name="DT_MaterialMaster_Lookup"> 
    <xsd:sequence> 
     <xsd:element maxOccurs="unbounded" name="Request"> 
     <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa040a511df843700145eccb24e</xsd:appinfo> 
     </xsd:annotation> 
     <xsd:complexType> 
      <xsd:sequence> 
     <xsd:element minOccurs="0" name="MaterialNumber" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa140a511df848500145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Description" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa240a511df95bf00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="DocumentNo" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa340a511dfb23700145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
     <xsd:element minOccurs="0" name="Plant" type="xsd:string"> 
      <xsd:annotation> 
      <xsd:appinfo source="http://SomeCompany.com/xi/TextID">64908aa440a511dfc65b00145eccb24e</xsd:appinfo> 
      </xsd:annotation> 
     </xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
    </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="MT_MaterialMaster_Lookup"> 
    <wsdl:part name="MT_MaterialMaster_Lookup" element="p1:MT_MaterialMaster_Lookup" /> 
    </wsdl:message> 
    <wsdl:message name="MT_MaterialMaster_Response"> 
    <wsdl:part name="MT_MaterialMaster_Response" element="p1:MT_MaterialMaster_Response" /> 
    </wsdl:message> 
    <wsdl:portType name="MI_MaterialMaster_Lookup_OB"> 
    <wsdl:operation name="MI_MaterialMaster_Lookup_OB"> 
     <wsdl:input message="p1:MT_MaterialMaster_Lookup" /> 
     <wsdl:output message="p1:MT_MaterialMaster_Response" /> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="MI_MaterialMaster_Lookup_OBBinding" type="p1:MI_MaterialMaster_Lookup_OB"> 
    <binding transport="http://schemas.xmlsoap.org/soap/http" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" /> 
    <wsdl:operation name="MI_MaterialMaster_Lookup_OB"> 
     <operation soapAction="http://SomeCompany.com/xi/WebService/soap1.1" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" /> 
     <wsdl:input> 
    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" /> 
     </wsdl:input> 
     <wsdl:output> 
    <body use="literal" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" /> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="MI_MaterialMaster_Lookup_OBService"> 
    <wsdl:port name="MI_MaterialMaster_Lookup_OBPort" binding="p1:MI_MaterialMaster_Lookup_OBBinding"> 
     <address location="http://bxdwas.MyCompany.com/XISOAPAdapter/MessageServlet?channel=:SOAP_SND_Material_Lookup" xmlns="http://schemas.xmlsoap.org/wsdl/soap/" /> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Respuesta

6

que tendría que publicar el WSDL para mí estar seguro, pero "Web Service devuelve Null" casi siempre significa que hay una disputa sobre espacios de nombres XML: el servicio te envía datos en un espacio de nombre y .NET espera un espacio de nombres diferente.

En este caso, tenga en cuenta que la mayor parte de la respuesta se encuentra en el espacio de nombres predeterminado, aunque el elemento contenedora esté en el espacio de nombres http://MyCompany.com/SomeCompany/mm/MaterialMasterSearch.

+0

Gran idea ... He topado con tu respuesta porque era una buena toma. Sin embargo, soy capaz de falsificar un paquete, y he falsificado su paquete y cambiado espacios de nombres por todo el lugar. Esto no parece ser el problema. No está fallando, y el objeto en sí NO ES NULO. Los elementos dentro del objeto son nulos. – Jerry

+0

@Jerry: Trataré de ver esto con más detalle durante el almuerzo, pero debo decir que el WSDL no muestra los signos que generalmente indican espacios de nombres mixtos. Mientras tanto, si pudieras mirar en tu archivo Reference.cs y ver qué espacios de nombres se han puesto en los elementos y comparar con el XML, sería bueno. –

+1

Hablé con los desarrolladores y les pedí que me enviaran un nuevo WSDL. (Juraría que les pedí que enviasen secretos del gobierno). FINALMENTE lo obtuve, y no lo sabrías, es diferente. Aparentemente, cada elemento ahora es una matriz de elementos, no un solo elemento, por lo que era nulo ... .NET no pudo determinar el tipo, por lo que lo dejó nulo. – Jerry

2

Asegúrese de que sus referencias de servicio estén actualizadas. Esto nos sucede cuando el servicio WSDL cambió pero las referencias no se actualizaron.

Cuestiones relacionadas