Avatar billede pagh80 Nybegynder
02. april 2005 - 19:11 Der er 14 kommentarer og
1 løsning

Problem: modtage et string array fra en apache tomcat webservice

Hej kloge folk

Vi har et stort problem:

Vi skal kommunikere med en webservice der ligger på en apaache tomcat 5.0 webserver, som er skrevet i java.

Vi skal lave en webklient i asp.net (c#) på en IIS.
Vi kan sagtens kommunikere med den og modtage f.eks. en simpel string eller et objekt. Problemet er at vi skal sende og modtage arrays af typen string. asp.net melder fejl når websiden startes.

her er koden der returnerer arrayet på webservicen:

public class TestService
{   

        public String[] GetTankNamezString()

        {   

    String[] array2;
    array2 = new String[10];
   
    String temp = "";
    for (int i=0; i<10; i++)
    {
        temp = "Tank"+i;
        array2[i]=temp;
       
    }
    return array2;
}

og her er koden til webklienten der modtager arrayet:

            WebApplicationTest.TestServiceRef.TestServiceService ServiceObj = new WebApplicationTest.TestServiceRef.TestServiceService();

            WebApplicationTest.TestServiceRef.TestClassStub TCObj =
new WebApplicationTest.TestServiceRef.TestClassStub();

System.Collections.IEnumerator myEnumerator = ServiceObj.GetTankNamezString().GetEnumerator();
           
while ( myEnumerator.MoveNext())
{                            ListTank.Items.Add(myEnumerator.Current.ToString());
}

Til at deploye vores java webservice bruger vi denne WSDD fil:

<deployment xmlns="http://xml.apache.org/axis/wsdd/"          xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="TestService" provider="java:RPC">
  <parameter name="className" value="TestService"/>
  <parameter name="allowedMethods" value="*"/>
  </service>
</deployment>

og WSDL filen:

  <?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://localhost:8080/axis/services/TestService" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8080/axis/services/TestService" xmlns:intf="http://localhost:8080/axis/services/TestService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <!--
WSDL created by Apache Axis version: 1.2RC2
Built on Nov 16, 2004 (12:19:44 EST)

  -->
- <wsdl:types>
- <schema targetNamespace="http://localhost:8080/axis/services/TestService" xmlns="http://www.w3.org/2001/XMLSchema">
  <import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
- <complexType name="ArrayOf_soapenc_string">
- <complexContent>
- <restriction base="soapenc:Array">
  <attribute ref="soapenc:arrayType" wsdl:arrayType="soapenc:string[]" />
  </restriction>
  </complexContent>
  </complexType>
  </schema>
  </wsdl:types>
  <wsdl:message name="GetTankNamezStringRequest" />
- <wsdl:message name="GetTankNamezStringResponse">
  <wsdl:part name="GetTankNamezStringReturn" type="impl:ArrayOf_soapenc_string" />
  </wsdl:message>
- <wsdl:portType name="TestService">
- <wsdl:operation name="GetTankNamezString">
  <wsdl:input message="impl:GetTankNamezStringRequest" name="GetTankNamezStringRequest" />
  <wsdl:output message="impl:GetTankNamezStringResponse" name="GetTankNamezStringResponse" />
  </wsdl:operation>
  </wsdl:portType>
- <wsdl:binding name="TestServiceSoapBinding" type="impl:TestService">
  <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="GetTankNamezString">
  <wsdlsoap:operation soapAction="" />
- <wsdl:input name="GetTankNamezStringRequest">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded" />
  </wsdl:input>
- <wsdl:output name="GetTankNamezStringResponse">
  <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/services/TestService" use="encoded" />
  </wsdl:output>
  </wsdl:operation>
  </wsdl:binding>
- <wsdl:service name="TestServiceService">
- <wsdl:port binding="impl:TestServiceSoapBinding" name="TestService">
  <wsdlsoap:address location="http://localhost:8080/axis/services/TestService" />
  </wsdl:port>
  </wsdl:service>
  </wsdl:definitions>

Håber der er nogen der ved hvad vi har lavet galt...

Der skal lige pointeres at der jo ikke er noget galt med webservicen...den kører i hvert fald og vi kan sende og modtage simple strings. det er arrays der er problemet.

på forhånd tak
Avatar billede arne_v Ekspert
02. april 2005 - 19:55 #1
Nu er det jo lidt gætværk uden at kende fejl meddelelsen.

Men jeg synes at I skulle prøve at angive en array serializer i wsdd filen.
Avatar billede arne_v Ekspert
02. april 2005 - 19:57 #2
Som vist i http://www.eksperten.dk/artikler/159

(I har ikke brug for den bean serializer som også er i artiklen)
Avatar billede burningice Nybegynder
02. april 2005 - 20:03 #3
en anden mulighed er at bruge XMLRPC som er et framework der fungerer på tværs af mange forskellige sprog. Den understøtter flerdimensionelle arrays uden problemer. Har selv lavet et system der benytter Python til serveren og en C# på klienten, og det var ikke noget problem med flerdimensionale arrays.

http://www.xmlrpc.com/
Avatar billede pagh80 Nybegynder
02. april 2005 - 20:04 #4
Kan du give et eksempel på hvordan man angiver sådan en i wsdd filen?  (vi har ikke så meget kendskab til dette endnu)

her er den fejlmeddelelse vi får:

The specified type was not recognized: name='string', namespace='http://schemas.xmlsoap.org/soap/encoding/', at <GetTankNamezStringReturn xmlns=''>.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The specified type was not recognized: name='string', namespace='http://schemas.xmlsoap.org/soap/encoding/', at <GetTankNamezStringReturn xmlns=''>.

Source Error:


Line 36:        [return: System.Xml.Serialization.SoapElementAttribute("GetTankNamezStringReturn")]
Line 37:        public string[] GetTankNamezString() {
Line 38:            object[] results = this.Invoke("GetTankNamezString", new object[0]);
Line 39:            return ((string[])(results[0]));
Line 40:        }


Source File: C:\Inetpub\wwwroot\WebApplicationTest\Web References\TestServiceRef\Reference.cs    Line: 38

Stack Trace:


[InvalidOperationException: The specified type was not recognized: name='string', namespace='http://schemas.xmlsoap.org/soap/encoding/', at <GetTankNamezStringReturn xmlns=''>.]
  System.Xml.Serialization.XmlSerializationReader.GetPrimitiveType(XmlQualifiedName typeName, Boolean throwOnUnknown) +1382
  System.Xml.Serialization.XmlSerializationReader.ReadArray(String typeName, String typeNs) +434
  System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, Boolean elementCanBeType, String& fixupReference) +340
  System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, String& fixupReference) +15
  Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReader1.Read3_GetTankNamezStringResponse() +378

[InvalidOperationException: There is an error in XML document (1, 325).]
  System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) +415
  System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, XmlDeserializationEvents events) +25
  System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader) +24
  System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) +1057
  System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) +218
  WebApplicationTest.TestServiceRef.TestServiceService.GetTankNamezString() in C:\Inetpub\wwwroot\WebApplicationTest\Web References\TestServiceRef\Reference.cs:38
  WebApplicationTest.WebForm1.BAxisConnect_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\webapplicationtest\webform1.aspx.cs:144
  System.Web.UI.WebControls.Button.OnClick(EventArgs e) +108
  System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +57
  System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +18
  System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +33
  System.Web.UI.Page.ProcessRequestMain() +1292
Avatar billede burningice Nybegynder
02. april 2005 - 20:05 #5
XMLRPC til java: http://ws.apache.org/xmlrpc/
XMLRPC til .Net: http://www.xml-rpc.net/
Avatar billede arne_v Ekspert
02. april 2005 - 20:10 #6
Der er et eksempel i den artikel jeg linkede til.
Avatar billede arne_v Ekspert
02. april 2005 - 20:11 #7
cf>

Det er kun et en dimensionelt array.

Og der bør ikke være nogen problemer i at bruge SOAP til det.
Avatar billede arne_v Ekspert
02. april 2005 - 20:13 #8
Jeg kan godt prøve at se om jeg kan få jeres kode til at virke hos mig.
Avatar billede pagh80 Nybegynder
02. april 2005 - 20:26 #9
Det kunne da være dejligt!

Vi har også prøvet at ændre vores WSDD fil med at tilføje:

<typeMapping xmlns:ns="http://genpakke"
                    qname="ns:ArrayOfTanks"
                    type="java:String[]"
                    serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
                    deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
                    encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

som vi så i din artikel. Men med denne kan services slet ikke deployes (Webservicen vises ikke på "http://localhost:8080/axis/services", og der kommer ikke nogen fejl når man deployer med WSDD filen.
Avatar billede arne_v Ekspert
02. april 2005 - 20:52 #10
Jeg har undersøgt det lidt.

Den type mapping er ikke nødvendig.

Faktisk virker din kode.

Med Axis 1.1 (på Tomcat 5.0) altså.

Den virker ikke med Axis 1.2 RC2 (på Tomcat 5.5).

En af de små hovsaer når man ikke kører final versions.

<wsdl:part name="GetTankNamezStringReturn" type="impl:ArrayOf_soapenc_string" />

versus

<wsdl:part name="GetTankNamezStringReturn" type="impl:ArrayOf_xsd_string" />

Fejlen er kendt og vil formentlig blive rettet inden 1.2 final.
Avatar billede arne_v Ekspert
02. april 2005 - 21:42 #11
Lidt mere læsning har afsløret en workaround.

Prøv:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="TestService" provider="java:RPC" style="wrapped" use="literal">
    <parameter name="className" value="TestService"/>
    <parameter name="allowedMethods" value="*"/>
  </service>
</deployment>

Det er
  style="wrapped" use="literal"
som skal gøre forskellen.

Det virker faktisk hos mig med Axis 1.2RC3 på Tomcat 5.5
Avatar billede pagh80 Nybegynder
02. april 2005 - 22:12 #12
Tusind tak! ... Vi vil lege lidt med det...(i morgen)
Afluttet... Point til Arne
Avatar billede pagh80 Nybegynder
02. april 2005 - 22:14 #13
Nå. jeg kan ikke give dig point, så send lige et svar. :)
Så håber jeg på at jeg får det til at virke imorgen.

Tak for hjælpen igen
Avatar billede arne_v Ekspert
02. april 2005 - 22:15 #14
svar kommer her

og vent med at accepter til I har set det virke
Avatar billede pagh80 Nybegynder
03. april 2005 - 11:45 #15
Vi har prøvet at indsætte følgende tekst i vores wsdd fil: style="wrapped" use="literal".
Det har resulteret i at vores service nu endelig virker, og vi er istand til at modtage arrays. :)
Ærgeligt at det er en bug som resultere i at man sidder fast, men dejligt at vi endelig kan komme videre.

200 point bliver sendt til dig arne_v
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester