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>