Costruire una chat per Silverlight con il PollingDuplexHttpBinding

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

Client Silverlight: invio e ricezione

Il servizio è pronto e si può procedere al suo utilizzo da parte della chat Silverlight. Innanzitutto va referenziato l'assembly %Program Files%\Microsoft SDKs\Silverlight\v3.0\Libraries\Client\System.ServiceModel.PollingDuplex.dll che contiene le classi client che si basano sul meccanismo di polling per l'interrogazione di un servizio duplex.

Poiché non esiste una procedura automatica da parte di Visual Studio, si procede poi alla creazione del canale mediante factory ottenuto dal PollingDuplexHttpBinding.

PollingDuplexHttpBinding binding = new PollingDuplexHttpBinding 
{ 
  InactivityTimeout = TimeSpan.FromMinutes(15), 
  ReceiveTimeout = TimeSpan.FromMinutes(60), 
  SendTimeout = TimeSpan.FromSeconds(60), 
}; 
 
// Il servizio risiede nella stessa web application di SL 
EndpointAddress address = new EndpointAddress(new Uri(new SilverlightHost().Source, "../ChatService.svc")); 
 
// Factory specifico per il duplex session 
IChannelFactory<IDuplexSessionChannel> factory = binding.BuildChannelFactory<IDuplexSessionChannel>(new BindingParameterCollection()); 
factory.Open(); 
 
// Creo il canale di comunicazione e lo apro 
chatChannel = factory.CreateChannel(address); 
chatChannel.BeginOpen(OnChatChannelOpenCompleted, null); 

Sul canale ottenuto si ha a disposizione semplicemente i metodi BeginSend e BeginReceive (in Silverlight c'è l'obbligo di effettuare chiamate asincrone) per mandare e ricevere messaggi. Non esistono metodi tipizzati come si è abituati a fare normalmente con i servizi WCF.

Occorre quindi instaurare una comunicazione con il servizio effettuando almeno una richiesta che apra la sessione sul server e nel caso della chat, questo si identifica con l'operazione di SignIn. Si crea quindi il messaggio e lo si invia invocando BeginSend:

Message message = Message.CreateMessage(MessageVersion.Soap11, 
                                        "http://ws.winfxitalia.com/SL/Chat/SignIn", 
                                        this.userName); 
chatChannel.BeginSend(message, OnSignInCompleted, null); 

Il callback OnSignInCompleted viene poi chiamato al termine della chiamata che, essendo OneWay, dà come ritorno solo l'avvenuta operazione. Da quel momento infatti è presenta una sessione ed è possibile ricevere messaggi dal servizio.

private void OnSignInCompleted(IAsyncResult ar) 
{ 
  try 
  { 
    // Termino la chiamata 
    chatChannel.EndSend(ar); 
 
    // Inizio a ricevere 
    chatChannel.BeginReceive(OnBeginReceiveCompleted, null); 
  } 
  catch (Exception e) 
  { 
    ShowError(e); 
  } 
} 

Il metodo OnBeginReceiveCompleted viene invocato solo quando il server ha un nuovo messaggio a disposizione del quale è possibile ricevere un riferimento chiamando EndReceive. Il servizio creato prevede che il Body del messaggio sia sempre di tipo ChatAction, perciò lo si deserializza e si lavora in base all'azione:

private void OnBeginReceiveCompleted(IAsyncResult ar) 
{ 
  try 
  { 
    Message message = chatChannel.EndReceive(ar); 
 
    // Deserializzato il body 
    ChatAction ca = message.GetBody<ChatAction>(); 
    switch (ca.Action) 
    { 
      case "SignIn": 
        UserSignedIn(ca.Data.ToString()); 
        break; 
      case "SignOut": 
        UserSignedOut(ca.Data.ToString()); 
        break; 
      case "Send": 
        UserMessage((ChatMessage)ca.Data); 
        break; 
    } 
 
    // Ricomincio a ricevere 
    chatChannel.BeginReceive(OnBeginReceiveCompleted, null); 
  } 
  catch (CommunicationException e) 
  { 
    // Errore, la sessione è stata chiusa 
  } 
} 

Come si può vedere dal codice precedente, nel caso di SignIn e SignOut, la proprietà Data è una stringa e contiene il nome utente, mentre nel caso di messaggio si ha a disposizione la struttura ChatMessage; i relativi metodi poi si occupano di eseguire sull'interfaccia le operazioni dovute.

Infine, terminata l'elaborazione del messaggio, si procede con il ricevere nuovamente un nuovo messaggio che potrebbe essere già a disposizione sul server o che può arrivare in un secondo momento; tutto questo avviene ciclicamente, finché non si chiude la sessione o non si smette di ricevere.

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