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.