Costruire una chat per Silverlight con il PollingDuplexHttpBinding
di Cristian Civera, in Windows Communication Foundation, 16 giugno 2009
Manipolazione dei messaggi
Come si è visto quindi, la creazione della chat necessita la manipolazione diretta del messaggio XML che transita sul cavo. Ciò è possibile farlo con la classe Message della quale è possibile creare un'istanza attraverso il metodo statico CreateMessage, che richiede la versione Soap (la versione 1.1 è supportata da Silverlight), l'action e il body. Quest'ultimo può essere di qualsiasi tipo, poiché attraverso il DataContractSerializer (il motore di serializzazione standard di WCF), viene convertito in XML.
Il seguente esempio crea un messaggio per l'operazione di SignIn (notare la action) passando il nome dell'utente:
Message msg = Message.CreateMessage(MessageVersion.Soap11, "http://ws.winfxitalia.com/SL/Chat/SignIn", "MyUserName");
Il codice precedente crea un messaggio la cui rappresentazione XML è:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"> http://ws.winfxitalia.com/SL/Chat/SignIn </Action> </s:Header> <s:Body> <string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">MyUserName</string> </s:Body> </s:Envelope>
Quando invece si vuole interrogare un Message, si hanno a disposizione una serie di proprietà, quali Headers, Version, State, per leggere i vari SOAP header, la versione SOAP e lo stato del messaggio (creato, letto, scritto, chiuso). Con il metodo GetBody
string userName = msg.GetBody<String>();
Poiché i messaggi vanno trattati manualmente, nelle operazioni di SignIn e SignOut e Send come body può bastare la stringa per rappresentare nei primi due casi il nome utente, nel terzo invece il testo del messaggio. Per quanto riguarda invece l'operazione NewAction, occorre un body più complesso per conoscere il tipo di notifica e un argomento specifico per ognuna di essa:
[DataContract(Namespace = "http://ws.winfxitalia.com/SL/Chat/Service/ChatAction")] [KnownType(typeof(ChatMessage))] public class ChatAction { [DataMember()] public string Action { get; set; } [DataMember()] public object Data { get; set; } }
Nello specifico, la proprietà Data ha lo scopo di mantenere il nome dell'utente che è entrato od uscito, oppure di trasportare il ChatMessage rappresentante il mittente e il messaggio. Si noti l'attributo KnownType, dato il tipo object, per istruire il DataContractSerializer sul fatto che Data potrebbe essere di quel tipo. Di seguito la definizione di ChatMessage:
[DataContract(Namespace = "http://ws.winfxitalia.com/SL/Chat/Service/ChatMessage")] public class ChatMessage { [DataMember()] public string UserName { get; set; } [DataMember()] public string Message { get; set; } }
Entrambe le classi vanno definite in modo uguale sull'applicazione client che sul servizio WCF, copiando il file oppure creando un link attraverso le funzionalità di Visual Studio.
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 3
- Pagina 4
- Pagina 5
- Pagina 6
Sullo stesso argomento
-
Mostrare le camere di sorveglianza tramite il .NET Micro Framework
-
La piattaforma Microsoft per il cloud computing: Windows Azure
-
Interoperabilità con WCF: invocare servizi da PHP e Flash
-
Le novità di Windows 7 per gli sviluppatori
-
Le problematiche più comuni di un'architettura M-V-VM con WPF
-
Introduzione a .NET RIA Services
-
Architettura Model-View-ViewModel in un'applicazione WPF
-
Condizioni e regole in Windows Workflow Foundation
-
Utilizzare Message Queuing per scalare le applicazioni

















Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.