Perl SOAP Server - Returns Strings Arrays with WSDL Compliant Names

Discussion in 'Perl Misc' started by Philluminati, May 8, 2008.

  1. Philluminati

    Philluminati Guest

    Hi guys.

    I have a SOAP Web Service which needs to return a string of Arrays but
    when it does, the SOAP Response is incorrect (or rather incompatible
    with .NET and my handwritten WSDL file). I have found some threads
    which claim to solve the problem, but with my poor knowldge of Perl, I
    don't know what the solution is. Can someone explain this post:

    http://markmail.org/message/zhhj2ba...m3> page:1 mid:iun5eywwjshyfocj state:results

    In simple terms?

    This is my SOAP Server Function:

    ---- RETURN ARRAY OF STRINGS ------------

    sub GetActiveUserList
    {
    my @usrLst = &StaticSession::getUsers;
    push @usrLst, "test";
    push @usrLst, "again";
    `echo @usrLst >> output.txt`;
    return @usrLst;
    }

    --- THIS IS MY WSDL WHICH TELLS THE CLIENT TO EXPECT BACK AN ARRAY OF
    STRINGS ----

    <?xml version="1.0" encoding="UTF-8"?>

    <definitions name="AMSession"
    targetNamespace="http://wwwpreview.centrinet.co.uk/~ptaylor/
    poc2/AMSession.wsdl"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://wwwpreview.centrinet.co.uk/~ptaylor/poc2/
    AMSession.wsdl"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsd1="http://wwwpreview.centrinet.co.uk/~ptaylor/poc2/
    AMSession.wsdl"

    >


    <types>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://wwwpreview.centrinet.co.uk/~ptaylor/
    poc2/AMSession.wsdl"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">

    <complexType name="ArrayOfString">
    <complexContent>
    <restriction base="soapenc:Array">
    <attribute ref="soapenc:arrayType"
    wsdl:arrayType="string[]"/>
    </restriction>
    </complexContent>
    </complexType>
    </schema>
    </types>

    <message name="void">
    </message>

    <message name="loginParams">
    <part name="username" type="xsd:string" />
    <part name="password" type="xsd:string" />
    </message>

    <message name="sessionKey">
    <part name="sessionkey" type="xsd:string" />
    </message>

    <message name="getVersionRetval">
    <part name="retval" type="xsd:string" />
    </message>

    <message name="returnValue">
    <part name="s-gensym?" type="tns:ArrayOfString" />
    <!-- <part name="s-gensym5" type="xsd:string" />
    <part name="s-gensym7" type="xsd:string" /> -->
    </message>

    <portType name="amsession_port_type">
    <operation name="Login">
    <input message="tns:loginParams" />
    <output message="tns:sessionKey" />
    </operation>
    <operation name="Logout">
    <input message="tns:sessionKey" />
    <output message="tns:void" />
    </operation>
    <operation name="GetActiveUserList">
    <input message="tns:void" />
    <output message="tns:returnValue" />
    </operation>
    <operation name="GetServerVersion">
    <input message="tns:void" />
    <output message="tns:getVersionRetval" />
    </operation>
    </portType>

    <binding name="amsession_binding" type="tns:amsession_port_type">
    <soap:binding style="rpc" transport="http://
    schemas.xmlsoap.org/soap/http" />

    <operation name="Login">
    <soap:eek:peration soapAction="urn:AMSession#Login" />
    <input>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </input>
    <output>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </output>
    </operation>

    <operation name="Logout">
    <soap:eek:peration soapAction="urn:AMSession#Logout" />
    <input>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </input>
    <output>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </output>
    </operation>

    <operation name="GetActiveUserList">
    <soap:eek:peration soapAction="urn:AMSession#GetActiveUserList" /
    >

    <input>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </input>
    <output>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </output>
    </operation>
    <operation name="GetServerVersion">
    <soap:eek:peration soapAction="urn:AMSession#GetServerVersion" />
    <input>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </input>
    <output>
    <soap:body
    encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/"
    namespace="urn:AMSession"
    use="encoded" />
    </output>
    </operation>
    </binding>

    <service name="SessionService">
    <documentation>Allows users to validate and get session keys
    for accessing subsystems</documentation>
    <port binding="tns:amsession_binding" name="amsession_port">
    <soap:address
    location="http://wwwpreview.centrinet.co.uk/cgi-bin/
    poc2/AMSession.cgi" />
    </port>
    </service>
    </definitions>

    --- THIS IS MY CLIENT IN VB.NET ---

    Public Class Form1

    Dim server As SessionService

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
    System.EventArgs) Handles MyBase.Load

    'create a new variable to represent the server.
    server = New SessionService
    End Sub

    Private Sub btnQuery_Click(ByVal sender As System.Object, ByVal e
    As System.EventArgs) Handles btnQuery.Click

    Dim users As String() = server.GetActiveUserList()

    lstUsers.Items.Clear()

    'lstUsers.Items.Add(users.ToString())

    If (users Is Nothing) Then Exit Sub

    For Each user As String In users
    lstUsers.Items.Add(user)
    Next

    End Sub
    End Class


    --- It gets "There is an Error in the XML document Exception". When I
    run a soap client with debugging on...this is the message I get in
    each direction:

    -------------- XML REQUEST -----------------------------

    Subroutine LWP::UserAgent::redirect_ok redefined at /usr/lib/perl5/
    site_perl/5.8.5/SOAP/Transport/HTTP.pm line 41.
    Subroutine LWP::protocol::collect redefined at /usr/lib/perl5/
    site_perl/5.8.5/SOAP/Transport/HTTP.pm line 59.
    SOAP::Transport::HTTP::Client::send_receive: POST
    http://wwwpreview.centrinet.co.uk/cgi-bin/poc2/AMSession.cgi HTTP/1.1
    Accept: text/xml
    Accept: multipart/*
    Accept: application/soap
    Content-Length: 421
    Content-Type: text/xml; charset=utf-8
    SOAPAction: "AMSession#GetActiveUserList"

    ---XML RESPONSE -------

    <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://
    www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://
    schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/
    XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/
    envelope/"><soap:Body><GetActiveUserList xmlns="AMSession"
    xsi:nil="true" /></soap:Body></soap:Envelope>
    SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 200 OK
    Connection: close
    Date: Thu, 08 May 2008 10:33:47 GMT
    Server: Apache/2.0.52 (CentOS)
    Content-Length: 539
    Content-Type: text/xml; charset=utf-8
    Client-Date: Thu, 08 May 2008 10:33:48 GMT
    Client-Peer: 10.254.254.168:80
    Client-Response-Num: 1
    SOAPServer: SOAP::Lite/Perl/0.70_04

    <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://
    www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://
    schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/
    XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/
    encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/
    envelope/"><soap:Body><GetActiveUserListResponse xmlns="AMSession"><s-
    gensym3 xsi:type="xsd:string">test</s-gensym3><s-gensym5
    xsi:type="xsd:string">again</s-gensym5></GetActiveUserListResponse></
    soap:Body></soap:Envelope>

    Any help would really be appreciated.

    Phill
    Philluminati, May 8, 2008
    #1
    1. Advertising

  2. Philluminati

    Ben Bullock Guest

    Philluminati <> wrote:
    > I have a SOAP Web Service which needs to return a string of Arrays but
    > when it does, the SOAP Response is incorrect (or rather incompatible
    > with .NET and my handwritten WSDL file). I have found some threads
    > which claim to solve the problem, but with my poor knowldge of Perl, I
    > don't know what the solution is. Can someone explain this post:


    > sub GetActiveUserList
    > {
    > my @usrLst = &StaticSession::getUsers;
    > push @usrLst, "test";
    > push @usrLst, "again";
    > `echo @usrLst >> output.txt`;
    > return @usrLst;
    > }


    There doesn't seem to be anything wrong with this, but the XML you
    showed wasn't generated by this routine anyway.

    > --- It gets "There is an Error in the XML document Exception". When I
    > run a soap client with debugging on...this is the message I get in
    > each direction:


    The only thing I can say is that this is not a problem with the above
    Perl routine, although it might be a problem with some other Perl
    somewhere else which you didn't show, or it might be an XML problem or
    a Visual Basic problem or something.
    Ben Bullock, May 9, 2008
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Bedford
    Replies:
    0
    Views:
    577
    Chris Bedford
    Aug 21, 2003
  2. Craig
    Replies:
    0
    Views:
    441
    Craig
    Feb 9, 2004
  3. richard
    Replies:
    2
    Views:
    466
    richard
    Jan 13, 2006
  4. Me
    Replies:
    2
    Views:
    428
  5. PerlFAQ Server
    Replies:
    0
    Views:
    385
    PerlFAQ Server
    Jan 6, 2011
Loading...

Share This Page