Web Service: "There is an error in XML"

Ho combattuto per tutto il giorno con questo errore, per poi risolverlo con un giochino.

Il discorso è in sè molto semplice: ho un web service che, dopo qualche peripezia su SAP, mi ritorna una classe neanche troppo complessa ovviamente serializzata.

Richiamando il webmethod da client però ottenevo il fastidioso errore all'oggetto del post: "There is an error in XML..."

Facendo la chiamata in locale invece funzionava tutto e se, all'interno dello stesso webmethod mi mettevo a spulciare nella stringa, mi sembrava di avere un xml perfetto.

Cosa fare allora?

Beh...premettiamo che non sapevo una cosa abbastanza pesante: non sapevo che i test in locale dei Web Service sono fatti in GET, mentre il loro utilizzo viene correttamente svolto tramite SOAP.

A mio modo di vedere questo rende pressochè inutile il test in locale del web service se non per sapere se il deploy sia andato a buon fine...

Detto questo per testare un web service da remoto ho trovato di vitale importanza Web Service Studio (link su GotDotNet che non ho capito bene se e quando chiude...).

Con questo gingillino è possibile richiamare i metodi di un webservice vedendo effettivamente qual'è la richiesta e la risposta SOAP anche, e sopratutto oserei dire, in presenza di errore. Fantastico.

Quindi ci ho messo ben poco a capire che la stringa di ritorno era farcita da tanti bei ";#x0" (o qualcosa di simile, scusate l'imprecisione), in pratica degli spazi che venivano codificati in quel modo rendendo illegibile la stringa (il motivo in realtà mi è oscuro).

Allora ho pensato a qualche problema con la serializzazione. Questo ERA il mio codice:

<WebMethod()> _
Public Function HelloWorld() As String
    Dim a As New Class1
    a.Nome = "Omar"
    a.Cognome = "Damiani"

    Dim strm As New IO.MemoryStream
    Dim writer As New System.Xml.XmlTextWriter(strm, System.Text.Encoding.UTF8)
    Dim serializer As New Serialization.XmlSerializer(GetType(Class1))

    serializer.Serialize(writer, a)
    Dim sRet As String
    sRet = System.Text.Encoding.UTF8.GetString(strm.GetBuffer())
    Return sRet

End Function

 Morale della favola: mi è bastato aggiungere un fantastico Trim alla riga colorata:

    sRet = System.Text.Encoding.UTF8.GetString(strm.GetBuffer()).Trim

 Et voilà!

In realtà per essere sicuro di non ottenere brutte sorprese ho completato il tutto passando prima da un oggetto XmlDocument, in questo modo se per qualsiasi motivo ottengo una stringa che potrebbe generare un errore XML, lo vengo a sapere prima perchè il web service solleverà un errore 500 o un'eccezione nel saggio caso in cui abbiate deciso di gestirlo:

Dim x As New XmlDocument
x.LoadXml(sRet)
Return x.OuterXml

Print | posted @ Wednesday, September 19, 2007 11:56 PM

Comments have been closed on this topic.