Condividi tramite


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 usati 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.

Client Factories and Channels
Una channel factory crea canali.

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 helper del canale descritte in questo argomento, vedere Panoramica del modello di canale.

La discussione seguente si basa sull'esempio di Trasporto 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 usato 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  
);  

Vedi anche