2010-07-01 5 views
5

Kann jeder eine Figur aus mein Problem ist ...Java Webservice Rückkehr Null-Objekt zu einem .net-Client

Ich bin ein Webmethod eines Java-Webservice (Axis 1.4) von einem .NET-Client aufrufen. Diese Methode gibt ein Map-Objekt zurück, und wenn ich es von einem Axis-Client aus aufrufen kann, funktioniert es einwandfrei, aber in meinem C# -Code ist es immer Null.

Das ist die WSDL ist:

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

und mein C# automatisch generierten Code:

[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; 
     } 
    } 
} 

ich habe überall leider gesehen, ich habe nicht die Lösung finden. Bitte, es gibt jemanden, was weiß es?

+0

Wir in ähnliche Probleme lief, wo .NET nicht ordnungsgemäß Arrays von einem Axis-generierte SOAP-Dienst wie vorgesehen deserialisieren kann. Leider bestand die Lösung darin, etwas anderes als Axis zu verwenden, um die Webdienste zu generieren. Ich habe auf der .NET-Seite des Zauns gearbeitet, also kann ich nicht genau sagen, was es war (oder ich hätte eine Antwort geschrieben); Betrachten Sie jedoch andere Java-basierte SOAP-Service-Engines. – kbrimington

Antwort

0

Und deshalb Web-Services von Code generiert fast nie kompatibel sind :)

Eine gute Möglichkeit, um dies zu arbeiten, ist die wsdl ersten zu machen, und einen schönen klaren wenig XSD definieren, das Karte sollte schön sowohl in .Net und Java. Eine Alternative ist etwas anderes als Achse 1.4 (yech, der Schmerz) für den Server, wenn Sie eine Kontrolle darüber haben.

Versuchen Sie schließlich, die Signaturen im Java-Code zu massieren, versuchen Sie, List mit MapItem [] zu ersetzen, oder umgekehrt, dass Sie Map nirgendwo in einem Rückgabeobjekt oder einem Parameter haben.

Ihre generierten WSDL-Datei wieder Überprüfung, würde ich sagen, dass dies wahrscheinlich wegen der XSD ist: anyType für den Schlüssel/Wert-Teil des mapItem.

Ich denke, das ist, was durch die Achse erzeugt wird, wenn Sie ein Java-Objekt in einem Parameter haben. Vertrau mir, du willst das nicht. Machen Sie es zu einer Zeichenkette, einem komplexen Typ oder einer Ganzzahl, aber ein Objekt kann nur Open-End-XML (xsd: anyType) implizieren und nicht viele Clients, die das nicht parsen.

0

Ich habe das gleiche Problem vor einer Weile konfrontiert. Dies passiert, wenn Sie versuchen, ein Array von Elementen über einen Achsen-Webservice mit einem .net-Client zu erhalten.

Das Problem ist "name = Artikel" Teil dieser Linie:

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

Versuchen in dieser bestimmten Zeile "Punkt" auf "mapItem" zu ändern. Versuchen Sie eine der folgenden Optionen:

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

oder

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

oder

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

So ist es sehr spät, Ihnen zu helfen, aber ich vor kurzem in das gleiche Problem lief.

Zum einen bin ich mit Eclipse-einen Web-Service zu erstellen. Das Problem für mich war, dass die erzeugte wsdd den Stil 'Dokument/Literal (umgebrochen)' verwendete. Das Ändern in "RPC" behob das Problem. Keine Nullen mehr.

Also vielleicht, wenn Sie Ihre Codierung RPC ändern, die Ihr Problem beheben könnte.

0

ich konfrontiert, und ich hatte so WSDL-Datei zu ändern:

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

zu

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

Nur die Proxy-Generierung durchzuführen.

0

Ich konfrontiert dasselbe Problem. Meine Lösung besteht darin, den Namespace in der automatisch generierten Funktion zu entfernen. Dies ist meine Funktion:

[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])); 
} 

ich den Namespace in dieser Linie entfernt. Beim Testen des Web-Service über SoapUI habe ich festgestellt, dass das Response-Objekt keinen Namespace hat. Aber automatisch generierter Code hat Namespace.

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

SoapUI Antwort war, wie folgend:

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

Verwandte Themen