Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Lo stack di canali della Windows Communication Foundation (WCF) è una pila di comunicazione a più livelli che include uno o più canali che elaborano i messaggi. Nella parte inferiore dello stack è presente un canale di trasporto responsabile dell'adattamento dello stack di canali al trasporto sottostante, ad esempio TCP, HTTP, SMTP e altri tipi di trasporto. I canali forniscono un modello di programmazione di basso livello per l'invio e la ricezione di messaggi. Questo modello di programmazione si basa su diverse interfacce e altri tipi noti collettivamente come modello di canale WCF. In questo argomento vengono illustrate le forme del canale, la costruzione di un listener di canale di base (sul servizio) e della channel factory (sul client).
Stack di canali
Gli endpoint WCF comunicano con il mondo usando uno stack di comunicazione denominato stack di canali. Il diagramma seguente confronta lo stack di canali con altri stack di comunicazione, ad esempio TCP/IP.
In primo luogo, le analogie: in entrambi i casi, ogni livello dello stack fornisce un'astrazione del mondo sotto tale livello ed espone tale astrazione solo al livello direttamente sopra di esso. Ogni livello usa l'astrazione solo del livello direttamente sotto di esso. Anche in entrambi i casi, quando due stack comunicano, ogni livello comunica con il livello corrispondente nell'altro stack, ad esempio, il livello IP comunica con il livello IP e il livello TCP con il livello TCP e così via.
Ora, le differenze: mentre lo stack TCP è stato progettato per fornire un'astrazione della rete fisica, lo stack di canali è progettato per fornire un'astrazione non solo del modo in cui viene recapitato il messaggio, ovvero il trasporto, ma anche altre funzionalità, ad esempio ciò che si trova nel messaggio o quale protocollo viene usato per la comunicazione, compreso il trasporto, ma molto più di quello. Ad esempio, l'elemento di associazione di sessione affidabile fa parte dello stack di canali, ma non è al di sotto del trasporto o del trasporto stesso. Questa astrazione viene ottenuta richiedendo al canale inferiore nello stack di adattare il protocollo di trasporto sottostante all'architettura dello stack di canali e quindi basandosi sui canali più in alto nello stack per fornire funzionalità di comunicazione come garanzie di affidabilità e sicurezza.
I messaggi passano attraverso lo stack di comunicazione come Message oggetti. Come illustrato nella figura precedente, il canale inferiore è denominato canale di trasporto. È il canale responsabile dell'invio e della ricezione di messaggi da e verso altre parti. Ciò include la responsabilità di trasformare l'oggetto Message da e verso il formato utilizzato per comunicare con altre parti. Al di sopra del canale di trasporto possono esserci un numero qualsiasi di canali di protocollo ognuno responsabile della fornitura di una funzione di comunicazione, ad esempio garanzie di recapito affidabili. I canali del protocollo operano sui messaggi che vi fluiscono nella forma dell'oggetto Message. In genere trasformano il messaggio, ad esempio aggiungendo intestazioni o crittografando il corpo, oppure inviano e ricevono i propri messaggi di controllo del protocollo, come notifiche di ricevuta.
Forme dei canali
Ogni canale implementa una o più interfacce note come interfacce di forma del canale o forme del canale. Tali forme di canale forniscono metodi orientati alla comunicazione, come inviare e ricevere o richiedere e rispondere, che il canale implementa e l'utente del canale utilizza. Alla base delle conformazioni del canale si trova l'interfaccia IChannel, un'interfaccia che fornisce un metodo GetProperty
<T>, destinato come meccanismo a strati per accedere a funzionalità arbitrarie esposte dai canali nello stack. Le cinque forme del canale che si estendono IChannel sono:
Inoltre, ognuna di queste forme ha un equivalente che si estende System.ServiceModel.Channels.ISessionChannel<TSession> per supportare le sessioni. Si tratta di:
Le forme del canale vengono modellate dopo alcuni dei modelli fondamentali di scambio di messaggi supportati dai protocolli di trasporto esistenti. Ad esempio, la messaggistica unidirezionale corrisponde a una IInputChannel/IOutputChannel coppia, request-reply corrisponde a IRequestChannel/IReplyChannel coppie e le comunicazioni duplex bidirezionali corrispondono a IDuplexChannel (che estende sia IInputChannel che IOutputChannel).
Programmazione con lo stack dei canali
Gli stack di canali vengono in genere creati usando un modello factory in cui un'associazione crea lo stack di canali. Sul lato di invio, un binding viene usato per costruire un ChannelFactory, che a sua volta costruisce uno stack di canali e restituisce un riferimento al canale superiore nello stack. L'applicazione può quindi usare questo canale per inviare messaggi. Per ulteriori informazioni, vedere Programmazione Client Channel-Level.
Sul lato ricezione viene usato un vincolo per costruire un IChannelListener, che ascolta i messaggi in arrivo. IChannelListener fornisce messaggi all'applicazione in ascolto creando stack di canali e passando il riferimento dell'applicazione al canale superiore. L'applicazione usa quindi questo canale per ricevere messaggi in arrivo. Per altre informazioni, vedere Programmazione del servizio Channel-Level.
Modello di oggetti del canale
Il modello di oggetto del canale è l'insieme di base di interfacce necessarie per implementare canali, ascoltatori di canale e fabbriche di canale. Sono disponibili anche alcune classi di base per facilitare le implementazioni personalizzate.
I listener di canale sono responsabili dell'ascolto dei messaggi in arrivo, quindi li recapitano al livello sopra attraverso i canali creati dal listener del canale.
Le channel factory sono responsabili della creazione di canali usati per l'invio di messaggi e per la chiusura di tutti i canali creati quando la channel factory viene chiusa.
ICommunicationObject è l'interfaccia principale che definisce la macchina a stati di base implementata da tutti gli oggetti di comunicazione. CommunicationObject fornisce un'implementazione di questa interfaccia di base che altre classi di canali possono derivare da anziché implementare nuovamente l'interfaccia. Non è tuttavia necessario: un canale personalizzato può implementare ICommunicationObject direttamente e non ereditare da CommunicationObject. Nessuna delle classi nella figura 3 è considerata parte del modello di canale; sono helper disponibili per gli implementatori di canali personalizzati che vogliono creare canali.
Gli argomenti seguenti descrivono il modello a oggetti del canale e varie aree di sviluppo che consentono di creare canali personalizzati.
Argomento | Descrizione |
---|---|
Servizio: ascoltatori di canale e canali | Descrivono gli ascoltatori di canale, che ascoltano i canali in ingresso in un'applicazione di servizio. |
Client: Channel Factory e canali | Vengono descritte le channel factory, che creano canali per connettersi a un'applicazione di servizio. |
Comprendere i cambiamenti di stato | Descrive il modo in cui lo stato dei System.ServiceModel.ICommunicationObject modelli di interfaccia cambia nei canali. |
Scelta di un modello di scambio di messaggi | Descrive i sei modelli di scambio di messaggi di base che i canali possono supportare. |
Gestione di eccezioni e errori | Descrive come gestire errori ed eccezioni nei canali personalizzati. |
Supporto di configurazione e metadati | Viene descritto come supportare l'uso di canali personalizzati dal modello di applicazione e come esportare e importare metadati usando associazioni ed elementi di associazione. |