Problema con DataTable ritornata da webservices

martedì 03 febbraio 2009 - 10.30

dipy Profilo | Junior Member

Salve a tutti.
Mi scusa da subito per l'eventuale banalità della mia domanda ma sono assolutamente novizio del mondo dei web services.
Ho creato un web services con un metodo che mi ritorna una datatable popolata con dei dati presi da DB.
Il web services richiamato da URL funziona correttamente.
Ho poi sviluppato una piccola applicazione client che ha lo scopo di richiamare il web services e di recuperare la dataTable restituita.
Purtroppo nel momento in cui richiamo il metodo del web services che dovrebbe ritornarmi la DataTable, mi viene restituito il seguente errore:

Errore nel documento XML (1, 1927).
in System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) in System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) in System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) in System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) in VersionUpdate.GetUpdateByVersion(String version) in CAAFClient._Default.btnUpdate_Click(Object sender, EventArgs e) in C:\Progetti\CAAF\CAAFClient\CAAFClient\Default.aspx.cs:riga 53

Mi chiedevo come potesse esserci un errore nell' XML restituito visto che nel metodo mi limito a restituire direttamente la datatable senza nessun' altra elaborazione che possa influire sull' XML restituito.
Qualcuno ha qualche idea?
Grazie a tutti, spero di essere stato sufficientemente chiaro.

rossimarko Profilo | Guru

Ciao,

prova a ritornare il dataset invece che la datatable: http://support.microsoft.com/kb/306134
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

dipy Profilo | Junior Member

Ho provato ma l'errore rimane lo stesso

rossimarko Profilo | Guru

Prova a scaricare il WebServiceStudio (http://www.codeplex.com/WebserviceStudio) e fai una chiamata di prova al tuo webservice. Ti riporta anche il dettaglio dello stream xml e così puoi verificare che carattere viene riportato alla colonna 1927
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

dipy Profilo | Junior Member

Ho provato e sembra sia stato utile. Mi ha dato il seguente messaggio:

System.InvalidOperationException: Errore nel documento XML (1, 1927). ---> System.ArgumentException: La DataTable "http://tempuri.org/DataSet2.xsd:VERSIONE_ADAPTER" non corrisponde ad alcuna DataTable nell'origine.

Quel tempuri.org non so bene da dove salti fuori visto che nel namespace dell'asmx l'ho cambiata con localhost

rossimarko Profilo | Guru

In questo momento il tuo webservice sta tornando una datatable o un dataset? Hai provato ad agganciare il debug nel webservice per verificare se l'errore viene generato direttamente dentro al webservice?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

dipy Profilo | Junior Member

Ora sono ritornato alla DataTable, cmq l'errore viene generato nel momento in cui nel client provo a valorizzare una DataTable con quanto mi viene ritornato dal metodo del web services:

localhost.VersionUpdate vsUpdate = new CAAFClient.localhost.VersionUpdate();
DataTable dtUpdate = vsUpdate.GetUpdateByVersion(version); << -- L'errore si genera sulla chiamata al metodo GetUpdateByVersion

rossimarko Profilo | Guru

Hai verificato che il webservice finisca correttamente il suo flusso? E quindi che durante la chiamata venga effettivamente ritornata la datatable ma non si ferma prima per un errore? Da quello che dici mi sembra di si, ma è sempre meglio avere una conferma.

Altra domanda: usi uno schema xsd per la gestione della datatable? Hai provato a forzare l'aggiornamento della webreference?

-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

dipy Profilo | Junior Member

Ti confermo che l'errore si scatena solo nel client che richiama il WS. A conferma di ciò allego l'XML che viene generato richiamando il webservices tramite l'URL.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

La dataTable viene riempita tramite una query impostata su un TableAdapter. Per quanto riguarda il forzare l'aggiornamento della webreference sinceramente non saprei bene come fare.

Jeremy Profilo | Guru

Mi sembra di ricordare che la datatable non sia serializzabile....concentrati sul consiglio di marko di farti restituire un dataset al posto di una datatable...il problema lo risolvi solo così.

In alternativa mostra il code behind del WebService....che vediamo se c'è qualcosa d'altro che non va.

Facci sapere..
ciao

rossimarko Profilo | Guru

>La dataTable viene riempita tramite una query impostata su un
>TableAdapter. Per quanto riguarda il forzare l'aggiornamento
>della webreference sinceramente non saprei bene come fare.
>

Devi semplicemente aggiornare il riferimento al servizio. Si fa quando viene modificato il metodo del webservice. Se fai tasto destro sul riferimento al web service dovresti trovare una voce aggiorna oppure in inglese "Update webreference". E poi inizialmente partiamo dal dataset come ha detto jeremy, quando vediamo che va proviamo a passare alla datatable
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

dipy Profilo | Junior Member

Ok ho riprovato con il DataSet e sono riuscito, prima probabilmente avevo commesso qualche altro errore. Grazie mille a tutti e due!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5