Client: channel factory e canali

In questo argomento viene illustrata la creazione di channel factory e canali.

Channel factory e canali

Le channel factory sono responsabili della creazione di canali. I canali creati da channel factory vengono utilizzati per l'invio di messaggi. Questi canali ottengono il messaggio dal livello superiore, eseguono l'elaborazione necessaria, quindi inviano il messaggio al livello inferiore. Nel grafico seguente viene illustrato questo processo.

Factory e canali client

Quando sono chiuse, le channel factory sono responsabili della chiusura di tutti i canali creati non ancora chiusi. Il modello rappresentato è asimmetrico perché quando un listener del canale viene chiuso, smette solo di accettare nuovi canali, mentre lascia aperti i canali esistenti affinché possano continuare a ricevere messaggi.

WCF fornisce supporti di classi di base per questo processo. Per un diagramma delle classi di supporto del canale descritte in questo argomento, vedere Panoramica sul modello dei canali.

La discussione seguente è basata sull'esempio di Transport: UDP.

Creazione di una channel factory

``UdpChannelFactory deriva da ChannelFactoryBase. L'esempio esegue l'override di GetProperty per fornire accesso alla versione del messaggio del codificatore di messaggi. L'esempio esegue inoltre l'override di OnClose per chiudere l'istanza di BufferManager quando la macchina a stati esegue la transizione.

Canale di output UDP

``UdpOutputChannel implementa IOutputChannel. Il costruttore convalida gli argomenti e costruisce un oggetto EndPoint di destinazione basato sull'elemento EndpointAddress che viene passato.

L'override di OnOpen crea un socket che viene utilizzato per inviare messaggi a questa classe EndPoint.

this.socket = new Socket(

this.remoteEndPoint.AddressFamily,

SocketType.Dgram,

ProtocolType.Udp

);

Il canale può essere chiuso normalmente o in modo anomalo. Se il canale viene chiuso normalmente, il socket viene chiuso e viene eseguita una chiamata al metodo OnClose della classe di base. Se viene generata un'eccezione, l'infrastruttura chiama Abort per verificare che il canale sia pulito.

this.socket.Close();
base.OnClose(timeout);

Implementare Send() e BeginSend()/EndSend(). In questo modo si ottengono due sezioni principali. Prima serializzare il messaggio in una matrice di byte:

ArraySegment<byte> messageBuffer = EncodeMessage(message);

Inviare quindi i dati risultanti sulla rete.

this.socket.SendTo(
  messageBuffer.Array, 
  messageBuffer.Offset, 
  messageBuffer.Count, 
  SocketFlags.None, 
  this.remoteEndPoint
);

Vedere anche

Concetti

Sviluppo di canali