2010-07-01 24 views
5

Puede alguien averiguar mi problema es ...Java servicio web volviendo objeto nulo a un cliente .NET

Voy a llamar a un WebMethod de un servicio web Java (Eje ​​1.4) desde un cliente .NET. Ese método devuelve un objeto Map, y si lo llamo desde un cliente Axis funciona bien, pero en mi código C# siempre es nulo.

Ese es el WSDL:

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:http.service.enlaces.portlet.ext.com" xmlns:intf="urn:http.service.enlaces.portlet.ext.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns1="http://model.enlaces.portlet.ext.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:http.service.enlaces.portlet.ext.com"> 

<wsdl:types> 

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xml.apache.org/xml-soap"> 
<import namespace="urn:http.service.enlaces.portlet.ext.com"/> 
<import namespace="http://model.enlaces.portlet.ext.com"/> 
<import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> 
<complexType name="mapItem"> 
    <sequence> 
<element name="key" nillable="true" type="xsd:anyType"/> 
<element name="value" nillable="true" type="xsd:anyType"/> 
    </sequence> 
</complexType> 
<complexType name="Map"> 
    <sequence> 
    <element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/> 
    </sequence> 
</complexType> 
</schema> 
</wsdl:types> 

<wsdl:message name="getFoldersAndBookmarksRequest" /> 
<wsdl:message name="getFoldersAndBookmarksResponse"> 
    <wsdl:part name="getFoldersAndBookmarksReturn" type="apachesoap:Map" /> 
</wsdl:message> 

<wsdl:portType name="BookmarksEntryServiceSoap"> 
<wsdl:operation name="getFoldersAndBookmarks"> 
     <wsdl:input name="getFoldersAndBookmarksRequest" message="intf:getFoldersAndBookmarksRequest" /> 
     <wsdl:output name="getFoldersAndBookmarksResponse" message="intf:getFoldersAndBookmarksResponse" /> 
    </wsdl:operation> 
    </wsdl:portType> 

<wsdl:binding name="Portlet_Bookmarks_BookmarksEntryServiceSoapBinding" type="intf:BookmarksEntryServiceSoap"> 
    <wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc" /> 
    <wsdl:operation name="getFoldersAndBookmarks"> 
     <wsdlsoap:operation soapAction="" /> 
     <wsdl:input name="getFoldersAndBookmarksRequest"> 
     <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
     </wsdl:input> 
     <wsdl:output name="getFoldersAndBookmarksResponse"> 
     <wsdlsoap:body use="encoded" namespace="urn:http.service.enlaces.portlet.ext.com" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" /> 
     </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 

y mi C# genera automáticamente código:

[System.Web.Services.Protocols.SoapRpcMethodAttribute("", RequestNamespace="urn:http.service.enlaces.portlet.ext.com", ResponseNamespace="urn:http.service.enlaces.portlet.ext.com")] 
[return: System.Xml.Serialization.SoapElementAttribute("getFoldersAndBookmarksReturn")] 
public Map getFoldersAndBookmarks() { 
    object[] results = this.Invoke("getFoldersAndBookmarks", new object[0]); 
    return ((Map)(results[0])); 
} 

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3082")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.SoapTypeAttribute(Namespace="http://xml.apache.org/xml-soap")] 
public partial class Map { 

    private mapItem[] itemField; 

    /// <comentarios/> 
    public mapItem[] item { 
     get { 
      return this.itemField; 
     } 
     set { 
      this.itemField = value; 
     } 
    } 
} 

I, he visto todas partes por desgracia, no encuentro la solución. Por favor, hay alguien que lo sepa?

+0

nos encontramos con problemas similares, en los que no podían .NET deserializar correctamente matrices conforme a lo dispuesto por un servicio SOAP generado por el Eje. Lamentablemente, para nosotros, la solución fue utilizar algo que no sea Axis para generar los servicios web. Trabajé en el lado .NET de la valla, así que no puedo decir exactamente qué era (o habría publicado una respuesta); sin embargo, considere buscar otros motores de servicio SOAP basados ​​en Java. – kbrimington

Respuesta

0

Y esta es la razón por los servicios web generadas a partir del código casi nunca son interoperables :)

Una buena manera de trabajar alrededor de esto es hacer que el WSDL en primer lugar, y definir un buen poco clara de XSD, que debe asignar muy bien en .Net y Java. Una alternativa es algo más que el eje 1.4 (yech, el dolor) para el servidor si usted tiene algún control sobre eso.

Finalmente, intente masajear las firmas en el código java, intente reemplazar List con MapItem [], o viceversa, asegúrese de que no tiene Map en ningún lugar en un objeto devuelto o un parámetro.

Revisando su wsdl generado de nuevo, diría que esto es probablemente debido a la xsd: anyType para la parte clave/valor del mapItem.

Creo que eso es lo que genera el eje si tiene un objeto java en un parámetro. Confía en mí, no quieres eso. Conviértalo en una cadena, o un tipo complejo, o un Entero, pero un Objeto solo puede implicar un xml abierto (xsd: anyType) y no hay muchos clientes que no saben cómo analizarlo.

0

Hace un tiempo tuve el mismo problema. Esto sucede cuando intenta obtener una matriz de elementos a través de un servicio web de eje con un cliente .net.

El problema es "name = elemento" parte de esta línea:

<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem"/> 

Prueba a cambiar en ese "elemento" en particular, a la línea "mapItem". Pruebe uno de estos:

<element maxOccurs="unbounded" minOccurs="0" name="mapItem" type="apachesoap:mapItem"/> 

o

<element maxOccurs="unbounded" minOccurs="0" name="key" type="apachesoap:mapItem"/> 

o

<element maxOccurs="unbounded" minOccurs="0" name="value" type="apachesoap:mapItem"/> 
1

Así que es muy tarde para ayudar a usted, pero yo hace poco estaba corriendo en el mismo problema.

En primer lugar, estoy usando Eclipse para crear un servicio web. El problema para mí fue que el wsdd generado estaba usando el estilo 'document/literal (wrapped)'. Cambiar eso a 'RPC' solucionó el problema. No más nulos.

Así que tal vez si cambia la codificación a RPC que también podría solucionar su problema.

0

I enfrentado eso, y he tenido que cambiar de manera archivo WSDL:

<wsdlsoap:body use="encoded" ... 

a

<wsdlsoap:body use="literal" ... 

Sólo para llevar a cabo la generación de proxy.

0

Me enfrenté al mismo problema. Mi solución es eliminar el espacio de nombres en la función autogenerada. Este es mi función:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.service-now.com/incident/getRecords", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)] 
[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")] 
[return: System.Xml.Serialization.XmlArrayItemAttribute("getRecordsResult", Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)] 
public getRecordsResponseGetRecordsResult[] getRecords([System.Xml.Serialization.XmlElementAttribute("getRecords", Namespace = "http://www.service-now.com/incident")] getRecords getRecords1) 
{ 
    object[] results = this.Invoke("getRecords", new object[] { 
       getRecords1}); 
    return ((getRecordsResponseGetRecordsResult[])(results[0])); 
} 

que eliminan el espacio de nombres en esta línea. Porque cuando pruebo el servicio web a través de SoapUI, me di cuenta de que el objeto de respuesta no tiene espacio de nombres. Pero el código generado automáticamente tiene espacio de nombre.

[return: System.Xml.Serialization.XmlArrayAttribute("getRecordsResponse", Namespace = "")] 

SoapUI La respuesta fue la siguiente:

<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"> 
    <SOAP-ENV:Body> 
     <getRecordsResponse> 
     <getRecordsResult> 
      <active>0</active> 
     </getRecordsResult> 
     </getRecordsResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Cuestiones relacionadas