Condividi tramite


Servizio: Listener di canale e canali

Esistono tre categorie di oggetti del canale: canali, listener di canale e channel factory. I canali sono l'interfaccia tra l'applicazione e lo stack dei canali. I listener del canale sono responsabili della creazione di canali sul lato che riceve (o in ascolto), in genere in risposta a un messaggio in arrivo nuovo o a una connessione. I channel factory sono responsabili della creazione di canali sul lato di invio per iniziare la comunicazione con un endpoint.

Listener di canale e canali

I listener del canale sono responsabili della creazione di canali e della ricezione di messaggi dal livello inferiore o dalla rete. I messaggi ricevuti sono recapitati al livello superiore utilizzando un canale creato dal listener del canale.

Nel diagramma seguente è illustrato il processo di ricezione dei messaggi e del loro recapito al livello superiore.

Channel listeners and channels

Listener di canale che riceve messaggi e li recapita al livello superiore tramite canali.

Il processo può essere rappresentato concettualmente come una coda all'interno di ogni canale, anche se l'implementazione non utilizza effettivamente una coda. Un listener del canale è responsabile della ricezione di messaggi dal livello inferiore o dalla rete e del loro inserimento nella coda. Il canale è responsabile del recupero dei messaggi dalla coda e della consegna dei messaggi al livello superiore quando questo richiede un messaggio, ad esempio chiamando Receive sul canale.

WCF fornisce supporti di classi di base per questo processo. Per un diagramma delle classi helper del canale descritte in questo articolo, vedere Panoramica del modello di canale.

La discussione seguente si basa sull'esempio di Trasporto UDP.

Creazione di un listener di canale

L’oggetto UdpChannelListener implementato dall'esempio deriva dalla classe ChannelListenerBase. Utilizza un solo socket UDP per ricevere datagrammi. Il metodo OnOpen riceve dati utilizzando il socket UDP in un ciclo asincrono. I dati vengono quindi convertiti in messaggi utilizzando il sistema di codifica messaggi:

message = UdpConstants.MessageEncoder.ReadMessage(
  new ArraySegment<byte>(buffer, 0, count),
  bufferManager
);

Poiché lo stesso canale del datagramma rappresenta messaggi in arrivo da un certo numero di origini, UdpChannelListener è un listener singleton. Esiste al massimo un elemento IChannel attivo associato a questo listener alla volta. Nell'esempio ne viene generato un altro solo se un canale restituito dal metodo AcceptChannel viene successivamente eliminato. Quando un messaggio viene ricevuto, viene accodato in questo canale singleton.

UdpInputChannel

La classe UdpInputChannel implementa IInputChannel. È composta da una coda di messaggi in arrivo popolata dal socket di UdpChannelListener. La coda di questi messaggi viene annullata dal metodo Receive.