Per quanto riguarda i singoli metodi dell'interfaccia, questi vengono marcati dall'attributo OperationContract per specificare che il servizio, che implementa quest'interfaccia, deve esporre il metodo. All'interno di questo attributo vengono utilizzate tre proprietà che regolano il flusso del messaggio durante la comunicazione. La proprietà OneWay specifica se il client deve aspettare una risposta dal server dopo aver invocato il metodo oppure può procedere con il proprio flusso senza attendere. IsInitiating impostata a true specifica che il metodo in questione (SignIn nel caso specifico) deve essere il primo ad essere invocato, pena un'eccezione di tipo InvalidOperationException. Infine, IsTerminating impostata a true specifica che il metodo (SignOut) deve essere l'ultimo ad essere invocato in quanto una chiamata ad esso provoca l'automatica chiusura del canale di comunicazione con il server. Sfruttare questi attributi in modo corretto può aiutare a ridurre il codice da scrivere per mantenere un corretto ordine del flusso dei dati.
In una chat esistono due fasi: la prima è quella in cui il client invia il messaggio sul server, la seconda quella in cui il server invia il messaggio a tutti i client connessi in quel momento. Questo significa che il server deve essere in grado di invocare alcuni metodi sul client e quindi si invertono le parti. In WCF questa situazione viene gestita creando un contratto cosiddetto di callback, che contiene l'interfaccia che il client espone al server al fine di ricevere informazioni.
In questo caso, le operazioni di cui un client deve essere notificato sono tre: la connessione di un altro client, l'invio di un messaggio ed infine la disconnessione.
public interface IChatCallback {
[OperationContract(IsOneWay = true)]
void UserSignIn(string nick);
[OperationContract(IsOneWay = true)]
void ReceiveMessage(string message);
[OperationContract(IsOneWay = true)]
void UserSignOut(string nick);
}Come visto nello snippet precedente, questa interfaccia va segnalata come callback dell'interfaccia server tramite l'attributo ServiceContract e la proprietà CallbackContract.
Il Servizio
Una volta stabilita l'interfaccia, è il momento di passare alla stesura del codice che gira sul server. La prima cosa da fare è creare una classe che implementa l'interfaccia server IChat.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service : IChat {
private static Object synchronizer = new Object();
static List<string> users = new List<string>();
public delegate void ChatEventHandler(object sender, ChatEventArgs e);
public static event ChatEventHandler ChatEvent;
private ChatEventHandler chatEventHandler = null;
private string nick;
IChatCallback callback = null;E' molto importante notare l'utilizzo dell'attributo ServiceBehavior per impostare la modalità di istanziazione del servizio (InstanceContextMode) e la modalità di accesso alle variabili di questo (ConcurrencyMode). Prima di andare avanti è importante chiarire il background in cui si muovono queste proprietà.
Quando un client invoca il servizio, viene istanziato un canale di comunicazione con il server ed in base al valore della proprietà InstanceContextMode viene deciso se creare un nuovo oggetto servizio o riutilizzarne uno già esistente. Infatti è erroneo pensare che il servizio ed il canale siano collegati tra loro. Ognuno vive di vita propria, quindi un canale può istanziare uno o più volte il servizio. I possibili settaggi per InstanceContextMode sono:
- PerCall: nonostante il canale con il client sia unico, ad ogni chiamata che arriva da questo viene creata una nuova istanza del servizio;
- PerSession: per ogni utente, viene istanziato un servizio che viene riutilizzato per tutte le successive chiamate provenienti da questo;
- Single: viene creata una sola istanza della classe servizio e viene riutilizzata per tutte le chiamate successive.
Attenzione: Questo articolo contiene un allegato
Contenuti dell'articolo
- Pagina 1
- Pagina 2
- Pagina 5
- Pagina 6
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.







Difficoltà
Utilità
Stampa
Download


10annidi.ASPItalia.com: iscriviti alla competizione e vinci fantastici premi ogni mese!

ciao Stefano, bell'articolo, molto interessante l'invocazione asincrona dei delegati sottoscritti all'evento.- C'é un motivo per cui non hai usato la ...
Continua »»» | Rispondi »»»