2010-07-01 15 views
5

कर सकते हैं मेरी समस्या से किसी एक आंकड़ा है करने के लिए अशक्त वस्तु लौटने ...जावा वेब सेवा एक .net ग्राहक

मैं एक (एक्सिस 1.4) एक नेट ग्राहक से एक जावा वेब सेवा के webmethod फोन कर रहा हूँ। वह विधि मैप ऑब्जेक्ट लौटाती है, और यदि मैं इसे एक्सिस क्लाइंट से कॉल करता हूं तो ठीक काम करता है, लेकिन मेरे सी # कोड में यह हमेशा शून्य होता है।

डबल्यूएसडीएल है कि:

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

और मेरे ग # स्वत: जनरेट कोड:

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

मैं, हर जगह दुर्भाग्य से देखा, मैं समाधान नहीं मिल रहा है। कृपया, कोई भी जानता है जो इसे जानता है?

+0

हम इसी तरह के मुद्दों, जहां नेट ठीक से के रूप में एक एक्सिस-उत्पन्न सोप सेवा द्वारा प्रदान की सरणियों deserialize नहीं कर सकता का सामना किया। दुर्भाग्यवश, हमारे लिए, समाधान वेब सेवाओं को उत्पन्न करने के लिए एक्सिस के अलावा कुछ और उपयोग करना था। मैंने बाड़ के .NET पक्ष पर काम किया, इसलिए मैं बिल्कुल नहीं कह सकता कि यह क्या था (या मैंने एक जवाब पोस्ट किया होगा); हालांकि, अन्य जावा-आधारित SOAP सेवा इंजनों को देखने पर विचार करें। – kbrimington

उत्तर

0

और यही कारण है कि कोड से उत्पन्न वेब सेवाओं लगभग कभी अंतर-संचालित :)

एक इस के आसपास काम करने का अच्छा तरीका पहले wsdl बनाने के लिए, और XSD का एक अच्छा स्पष्ट छोटा सा परिभाषित करने के लिए है, जो नक्शा चाहिए अच्छी तरह से नेट और जावा दोनों में। एक विकल्प सर्वर के लिए धुरी 1.4 (खमीर, दर्द) के अलावा कुछ है यदि आपके पास इसका कोई नियंत्रण है।

अंत में, जावा कोड में हस्ताक्षरों को मालिश करने का प्रयास करें, MapItem [] के साथ सूची को बदलने का प्रयास करें, या इसके विपरीत, सुनिश्चित करें कि आपके पास वापसी ऑब्जेक्ट या पैरामीटर में कहीं भी मानचित्र नहीं है।

फिर से आपके जेनरेट किए गए wsdl की समीक्षा करना, मैं कहूंगा कि यह शायद xsd की वजह से है: मानचित्र के कुंजी/मूल्य भाग के लिए कोई टाइप टाइप करें।

मुझे लगता है कि यदि आपके पास पैरामीटर में जावा ऑब्जेक्ट है तो धुरी द्वारा उत्पन्न किया गया है। मेरा विश्वास करो, आप उसे नहीं चाहते हैं। इसे एक स्ट्रिंग, या एक जटिल प्रकार, या एक इंटीजर बनाएं, लेकिन ऑब्जेक्ट केवल ओपन एंड एक्सएमएल (xsd: anyType) को इंगित कर सकता है और कई क्लाइंट्स को इसका विश्लेषण नहीं करना है।

0

मुझे थोड़ी देर पहले एक ही समस्या का सामना करना पड़ा। यह तब होता है जब आप किसी .net क्लाइंट के साथ धुरी webservice के माध्यम से तत्वों की सरणी प्राप्त करने का प्रयास करते हैं।

समस्या "नाम = आइटम" इस लाइन का हिस्सा है:

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

कि विशेष रूप से लाइन "आइटम" से "mapItem" में बदलने का प्रयास करें। इनमें से किसी एक का प्रयास करें:

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

या

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

या

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

इसलिए यह बहुत देर से मदद करने के लिए, लेकिन मैं हाल ही में एक ही समस्या में चल रहा था।

सबसे पहले मैं एक वेब सेवा बनाने के लिए ग्रहण का उपयोग कर रहा हूं। मेरे लिए समस्या यह थी कि उत्पन्न wsdd 'दस्तावेज़/शाब्दिक (लपेटा)' शैली का उपयोग कर रहा था। 'आरपीसी' को बदलकर इस मुद्दे को ठीक किया गया। कोई और नल।

तो हो सकता है कि यदि आप आरपीसी में अपना एन्कोडिंग बदलते हैं जो आपकी समस्या को भी ठीक कर सकता है।

0

मैं का सामना करना पड़ा है कि, और मैं WSDL फ़ाइल इसलिए बदलना पड़ा:

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

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

को केवल प्रॉक्सी पीढ़ी प्रदर्शन करने के लिए।

0

मुझे एक ही समस्या का सामना करना पड़ा। मेरा समाधान ऑटो-जेनरेटेड फ़ंक्शन में नेमस्पेस को हटाना है।

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

मैं इस पंक्ति में नाम स्थान से हटाया: यह मेरा कार्य है। जब मैं सोपूआई के माध्यम से वेब सेवा का परीक्षण करता हूं, तो मुझे एहसास हुआ कि प्रतिक्रिया ऑब्जेक्ट में कोई नामस्थान नहीं है। लेकिन ऑटो-जेनरेट कोड में नेमस्पेस है।

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

SoapUI रिस्पांस निम्नलिखित के रूप में किया गया था:

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

संबंधित मुद्दे