Press "Enter" to skip to content

HTTP Listener e XML

Oggi, lavorando ad un piccolo progetto che coinvolgeva l’oggetto .NET nel titolo, ci siamo imbattuti in una stranezza, ovvero se trasmettevo tramite una HTTP Get un dato al listener che conteneva una stringa (“Buongiorno, sono la stringa”) arrivava esattamente come trasmessa, mentre se trasmettevo la serializzazione di una classe in XML la stringa risultante era diversa da quella trasmessa

e davanti al <?xml c’erano 3 caratteri strani, ovvero una i con la umlaot, una doppia virgoletta chiusa e un punto di domanda rovescio. Rovistando sulla stringa ci siamo accorti che la serializzazione XML per default inserisce come primo carattere della stringa/file serializzato il carattere unicode \UFEFF, che è un carattere non visibile (lo scarta automaticamente anche notepad), questo carattere serve a chi poi riceve la stringa per capire se si tratta di testo BigEndian o LittleEndian, potete leggere il dettaglio su Wikipedia se siete curiosi. Questo carattere unicode può essere fatto omettere al serializzatore .NET inserendo negli XmlWriterSettings che si passano all’XmlSerializer il parametro Encoding=false se non vogliamo questo carattere. Ovviamente togliere il carattere non è esattamente la soluzione al problema, anche se può essere un buon workaround, la soluzione vera è fare un UrlEncoding della stringa XML prima di spedirla con il GET, oppure, se vogliamo essere categorici, possiamo convertire la stringa XML in un Base64 e riconvertirla in unicode all’arrivo al listener.

Usualmente ci si accorge di questo errore perché deserializzando la classe si riceve la seguente eccezione:

System.Xml.XmlException
Data at the root level is invalid. Line 1, position 1.

ecco invece uno screenshot del formato della stringa XML

xml_err_2