Costruire una chat per Silverlight con il PollingDuplexHttpBinding

6 pagine in totale: <<Indietro 1 [2] 3 4 5 6 Avanti >>

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 è possibile invece ottenere l'oggetto deserializzato utilizzando sempre il DataContractSerializer. Il messagio precedente può infatti essere letto nel seguente modo:

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.

6 pagine in totale: <<Indietro 1 [2] 3 4 5 6 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.



Segnala su: Facebook MSDN Social Twitter Segnalo Wikio Diggita Technorati Stumbleupon Google Yahoo FriendFeed Delicious Furl

TUTORIALS
TOP TEN ARTICOLI
ARTICOLI VIA E-EMAIL

Iscriviti alla nostra newsletter nuoviarticoli per ricevere via e-mail le notifiche!

MEDIA
IN EVIDENZA
MISC