Scrivo questo post per segnalare un piccolo problema in cui ci si può imbattere se si vuole mandare notifiche ad un device. Su MSDN o per la rete si trovano piccoli esempio che preparano l'XML per toast o tile concatenando il testo. Siamo nel 2011 e direi che è ora di scrivere il codice bene utilizzando uno dei molteplici modi che il .NET Framework mette a disposizione, come LINQ to XML, ed evitare problemi di caratteri speciali.
Nel mio codice ho dovuto quindi, una volta preparato l'XML, salvarlo in uno Stream per poi tenermi i byte da inviare con WebClient o WebRequest, con qualcosa simile a questo:
using (MemoryStream stream = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(stream, settings)) { doc.Save(writer); writer.Flush(); data = stream.ToArray(); } }
Inviando poi la variabile data con un POST le notifiche però non arrivavano. Debuggando una toast notification mentre l'app era attiva, ricevevo una eccezione che però non potevo intercettare, perché generata da codice della libreria Microsoft. Dopo vari tantitivi ho capito che il problema stava nel preamble dell'encoding: tre byte inseriti all'inizio dello Stream per indicare il tipo di codifica utilizzata per il testo XML. Sebbene non dovrebbe essere un problema a Windows Phone, a lui non piace e dato che usavo un UTF8 e l'encoding viene letto dall'header HTTP, ho dovuto rimuovere questa informazione creando l'encoding a mano e passando il parametro di preamble a false.
byte[] data; Encoding encoding = new UTF8Encoding(false); XmlWriterSettings settings = new XmlWriterSettings(); settings.Encoding = encoding; using (MemoryStream stream = new MemoryStream()) { using (XmlWriter writer = XmlWriter.Create(stream, settings)) { doc.Save(writer); writer.Flush(); data = stream.ToArray(); } }
Spero vi sia utile.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Take Me Back e l'architettura, il 22 dicembre 2010 alle 21:27