#135 - Gestire il canale di comunicazione con WCF
di Cristian Civera, in Windows Communication Foundation, 25 settembre 2009
Archiviato in: .NET Framework 3.0, Windows Communication Foundation
Windows Communication Foundation è un framework per la creazione di servizi che si basa sul concetto di canali per la comunicazione tra un endpoint e l'altro, sia che essi siano di tipi half oppure full duplex.
Per creare un canale esistono due vie, delle quali la più comune consiste nel sfruttare la classe proxy generata dal tool svcutil, la quale eredita da ChannelBase. Internamente, qualunque operazione facciamo, viene utilizzato un ChannelFactory per istanziare un canale di comunicazione; in alternativa possiamo usare direttamente il ChannelFactory e costruire un canale per uno specifico servizio. In ogni caso quello che otteniamo è un'istanza di un oggetto che al compito di instaurare un dialogo con il servizio remoto.
Esso implementa l'interfaccia ICommunicationObject, basilare nell'infrastruttura di WCF, che mantiene prima di tutto lo stato del canale. La proprietà State può infatti assumere i valori: Created, Opening, Opened, Closing, Closed e Faulted. Nello stato di creato il canale può essere configurato, ma non lo è più negli altri stati che stanno rispettivamente ad indicare che il canale è in corso di apertura, è stato aperto, è in corso di chiusura, è chiuso o è in uno stato di errore.
Abbiamo inoltre gli omonimi eventi per conoscere quando l'oggetto cambia il proprio stato e possiamo ovviamente aprire o chiudere il canale (con metodi sincroni e asincroni) quando dobbiamo chiamare operazioni o abbiamo terminato il da farsi. L'apertura esplicita del canale non è un'operazione che si è abituati a fare dato che WCF ha un meccanismo di auto apertura qualora non fosse stato già fatto. Questo comporta però minori prestazioni perché otteniamo ogni volta un lock che rallenta le chiamate concorrenziali ed è consigliato quindi aprire in modo esplicito il canale.
Nello script si vede quindi come assicurarsi che il canale sia sempre nello stato corretto, così da aprilo se necessario.
IMioServizio client; private void EnsureService() { ICommunicationObject com = client as ICommunicationObject; if (client == null || com.State != CommunicationState.Opened) { // Abortisco tutte le operazioni precedenti e chiudo il canale if (com != null) com.Abort(); // Creo un nuovo canale client = ChannelFactory<IMioServizio>.CreateChannel(binding, endpoint); // Apertura esplicita client.Open(); } }
Nel codice precedente viene illustrato un metodo per assicurarsi prima di ogni chiamata al servizio che l'istanza del canale sia presente e nello stato corretto. In caso contrario crea il canale e apre in modo esplicito il canale. La chiamata al metodo Abort, la quale termina tutte le operazioni e chiude il canale, è preferibile a Close perché quest'ultima può causare errori nel tentativo di chiusura.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
-
Real Code Day 4: Accesso ai dati con Entity Framework
-
Rilasciata la Silverlight Toolkit October 2009 Release
-
Visual Studio 2010 e .NET Framework 4.0: beta 2 e data di release RTM
-
#175 - Visualizzare gli errori dei WCF Data Services
-
Disponibili le trial in italiano di VS 2010
-
#155 - Gestire e ottimizzare messaggi di grandi dimensioni in WCF
-
#1011 - Eseguire chiamate cross domain con jQuery e ASP.NET
-
.NET Campus
-
Il nostro processo di stesura dei libri: un caso di successo
-
Progress di una chiamata Silverlight ad un servizio
-
Multithreading e parallel computing nel .NET Framework 4.0

Commenti
mi piace
non mi piace
Facebook
Twitter










