Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    WebService con Oggetto di Ritorno

    Salve Ragazzi,
    chiedo aiuto a qualche uomo di buona volontà che all'interno della community ha più esperienza di me con l'uso dei webservice e soprattutto abbia voglia e tempo per darmi un suggerimento utile a risolvere un problema su cui sto perdendo la testa da qualche giorno.

    Ho la necessità di utilizzare un servizio SOAP che referenzio all'interno del mio applicativo e che serve ad inserire in un database i nominativi dei Clienti di un gestionale. Il WSDL espone un metodo che serve a compiere quest'azione (inserisciCliente) e che accetta come parametri di ingresso due oggetti: un header (contenente alcuni valori necessari ad identificare l'azione che si vuole compiere) e un oggetto di tipo "cliente" che contiene tutti i campi utili ad identificare i dati del cliente (nome, cognome, indirizzo, ecc ecc).

    IL WSDL è il seguente:

    codice:
    <?xml version = '1.0' encoding = 'UTF-8'?><definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://URL/" name="GestioneClientiWSTrs" targetNamespace="http://URL/">
        <types>
            <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap11-enc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://URL/" elementFormDefault="qualified">
                <complexType name="HeaderOperazione">
                    <sequence>
                        <element name="val_01" type="string"/>
                        <element name="val_02" type="string"/>
                        <element name="val_03" type="string"/>
                    </sequence>
                </complexType>
                <complexType name="EsitoBean">
                    <sequence>
                        <element name="esito" type="int"/>
                        <element name="listaErrori" type="tns:ArrayOfMessaggioBean"/>
                        <element name="listaMessaggi" type="tns:ArrayOfMessaggioBean"/>
                    </sequence>
                </complexType>
                <complexType name="ArrayOfMessaggioBean">
                    <complexContent>
                        <restriction base="soap11-enc:Array">
                            <sequence>
                                <element name="item" type="tns:MessaggioBean"/>
                            </sequence>
                            <attribute ref="soap11-enc:arrayType" wsdl:arrayType="tns:MessaggioBean[]"/>
                        </restriction>
                    </complexContent>
                </complexType>
                <complexType name="MessaggioBean">
                    <sequence>
                        <element name="area" type="string"/>
                        <element name="codice" type="string"/>
                        <element name="descr" type="string"/>
                    </sequence>
                </complexType>
                <complexType name="ArrayOfClienti">
                    <complexContent>
                        <restriction base="soap11-enc:Array">
                            <sequence>
                                <element name="item" type="tns:Clienti"/>
                            </sequence>
                            <attribute ref="soap11-enc:arrayType" wsdl:arrayType="tns:Clienti[]"/>
                        </restriction>
                    </complexContent>
                </complexType>
                <complexType name="Clienti">
                    <complexContent>
                        <extension base="tns:ClienteDettaglio">
                            <sequence>
                                <element name="codiceStrongCliente" type="string"/>
                                <element name="codiceCliente" type="string"/>
                            </sequence>
                        </extension>
                    </complexContent>
                </complexType>
                <complexType name="ClienteDettaglio">
                    <sequence>
                        <element name="nome" type="string"/>
                        <element name="cognome" type="string"/>
                        <element name="codiceFiscale" type="string"/>
                        <element name="indirizzo" type="string"/>
                    </sequence>
                </complexType>
                <complexType name="OutputInserisciCliente">
                    <complexContent>
                        <extension base="tns:EsitoBean">
                            <sequence>
                                <element name="Clienti" type="tns:Clienti"/>
                            </sequence>
                        </extension>
                    </complexContent>
                </complexType>
                <complexType name="InputInserisciCliente">
                    <sequence>
                        <element name="cliente" type="tns:ClienteDettaglio"/>
                    </sequence>
                </complexType>
            </schema>
        </types>
        <message name="GestioneClientiWSTrs_inserisciCliente">
            <part name="headerOperazione" type="tns:HeaderOperazione"/>
            <part name="theInput" type="tns:InputInserisciCliente"/>
        </message>
        <message name="GestioneClientiWSTrs_inserisciClienteResponse">
            <part name="result" type="tns:OutputInserisciCliente"/>
        </message>
        <portType name="GestioneClientiWSTrs">
            <operation name="inserisciCliente" parameterOrder="headerOperazione theInput">
                <input message="tns:GestioneClientiWSTrs_inserisciCliente"/>
                <output message="tns:GestioneClientiWSTrs_inserisciClienteResponse"/>
            </operation>
        </portType>
        <binding name="GestioneClientiWSTrsSoapHttp" type="tns:GestioneClientiWSTrs">
            <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
            <operation name="inserisciCliente">
                <soap:operation soapAction="http://URL"/>
                <input>
                    <soap:body use="encoded" namespace="http://URL/" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" parts="headerOperazione theInput"/>
                </input>
                <output>
                    <soap:body use="encoded" namespace="http://URL" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" parts="result"/>
                </output>
            </operation>
        </binding>
        <service name="GestioneClientiWSTrs">
            <port name="GestioneClientiWSTrsSoapHttpPort" binding="tns:GestioneClientiWSTrsSoapHttp">
                <soap:address location="http://URLSERVIZIO"/>
            </port>
        </service>
    </definitions>

    Per inserire un nuovo cliente uso una sintassi del genere:

    codice:
    mio.webservice.HeaderOperazione mioHead = new mio.webservice.HeaderOperazione();
    mioHead.val_01 = "valore01";
    mioHead.val_02 = "valore02";
    mioHead.val_03 = "valore03";
    
    mio.webservice.InputInserisciCliente ClienteInput = new mio.webservice.InputInserisciCliente();
    ClienteInput.cliente = new it.istruzione.pubblica.wssidi1coll.ClienteDettaglio();
    
    
    ClienteInput.cliente.nome = "Nome Cliente";
    ClienteInput.cliente.cognome = "Cognome Cliente";
    ClienteInput.cliente.codiceFiscale = "CODFIS";
    ClienteInput.cliente.indirizzo = "Indirizzo Cliente";
    
    
    mio.webservice.GestioneClientiWSTrs GestioneClienti = new mio.webservice.GestioneClientiWSTrs();
    GestioneClienti.Credentials = new NetworkCredential("miousername", "miapassword");

    A questo punto dovrei richiamare il metodo dell'oggetto GestioneClienti denominato InputInserisciCliente ​che a sua volta dovrebbe restituire un oggetto di tipo OutputInserisciCliente all'interno del quale si trovano valori come esito (di tipo int con 0 per azione non eseguita e 1 per azione eseguita) listaErrori e listaMessaggi (di tipo array). In poche parole la sintassi dovrebbe essere qualcosa del tipo:

    codice:
    mio.webservice.OutputInserisciCliente OutputCliente = GestioneClienti.InputInserisciCliente(mioHead, ClienteInput);

    Fino a qui nessun problema, l'inserimento viene eseguito correttamente ma quando richiama ma quando richiamo i campi di OutputCliente con una sintassi del tipo

    codice:
    Response.Write(OutputCliente.Esito.Tostring()

    i valori sono sempre nulli (il tipo int è sempre 0 e gli array sono sempre vuoti). Per essere sicuro che il webservice effettivamente restituisse il un XML contenente i dati ho provato ad usare uno sniffer (SOAPuI) ed infatti i valori di ritorno sono regolarmente presenti. Dove sbaglio???



    Anticipatamente Grazie a tutti coloro che vorranno rispondermi e Tanti Auguri di Buon Fine 2013 e di uno Splendido 2014 a tutta la board!!

    P.S.
    Questo l'XML che visualizzo con SOAPuI

    codice:
    <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://URL/">  <env:Body>
        <ns0:inserisciClienteResponse env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
          <result href="#ID1"/>
        </ns0:inserisciClienteResponse>
        <ns0:OutputInserisciCliente id="ID1" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns0:OutputInserisciCliente">
          <ns0:esito xsi:type="xsd:int">0</ns0:esito>
          <ns0:listaErrori href="#ID2"/>
          <ns0:listaMessaggi xsi:type="ns0:ArrayOfMessaggioBean" ans1:arrayType="ns0:MessaggioBean[0]" xsi:nil="1" xmlns:ans1="http://schemas.xmlsoap.org/soap/encoding/"/>
          <ns0:ClienteDettaglio href="#ID3"/>
        </ns0:OutputInserisciCliente>
        <ns0:ArrayOfMessaggioBean id="ID2" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ans1:Array" ans1:arrayType="ns0:MessaggioBean[1]" xmlns:ans1="http://schemas.xmlsoap.org/soap/encoding/">
          <item href="#ID4"/>
        </ns0:ArrayOfMessaggioBean>
        <ns0:ClienteDettaglio id="ID3" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns0:SedeSidi">
          <ns0:nome xsi:type="xsd:string">Nome Cliente</ns0:nome>
          <ns0:cognome xsi:type="xsd:string">Cognome Cliente</ns0:cognome>
          <ns0:idcliente xsi:type="xsd:string">ID Cliente</ns0:idcliente>
      </ns0:ClienteDettaglio>
        <ns0:MessaggioBean id="ID4" env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns0:MessaggioBean">
          <ns0:area xsi:type="xsd:string">AREA</ns0:area>
          <ns0:codice xsi:type="xsd:string">CODICE</ns0:codice>
          <ns0:descr xsi:type="xsd:string">TIPOERRORE</ns0:descr>
        </ns0:MessaggioBean>
    </env:Body>
    </env:Envelope>

  2. #2
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887

    ma quanti sono i WS nella libreria

    mio
    .webservice ?

  3. #3
    Ciao Ciko!! Innanzitutto grazie per l'interessamento. La libreria "mio.webservice" contiene decine di servizi, ognuno di questi può essere usato per eseguire una o più operazioni sul database del gestionale: l'inserimento di un cliente, quello di una fattura, ecc. ecc. . Naturalmente tutti gli oggetti e i metodi che è possibile chiamare hanno nomi univoci e ognuno fa specifico riferimento ad un determinato servizio.

    In ogni caso, onde evitare di incappare in errori di qualsiasi tipo, ho provveduto ad eliminare dalle mie referenze tutti i servizi lasciando, ovviamente, solo quello che descrivo precedentemente.

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    quindi sempre: <ns0:esitoxsi:type="xsd:int">0</ns0:esito>


    per curiosita', sei costretto a mettere le credenziali di accesso dell'utente o puoi evitare ?

    mio.webservice.GestioneClientiWSTrs GestioneClienti = new mio.webservice.GestioneClientiWSTrs();
    GestioneClienti.Credentials = new NetworkCredential("miousername", "miapassword");

    Mi e' capitata la stessa situazione ed era una questione di permessi sul DB.

  5. #5
    Si, assolutamente, se non invio username e password, non posso accedere al servizio. Anche per quello che riguarda lo sniffer che restituisce il corretto XML di ritorno, devo inserire i valori necessari all'autenticazione.

    Mi chiedevo anche un altra cosa (è un test che sto tentando proprio mentre scrivo) è plausibile che il servizio possa essere eseguito solo usando un EventHandler per una chiamata asincrona?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.