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.
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 classe CommunicationObject implementa ICommunicationObject e attiva la macchina a stati descritta nel passaggio 2 di Sviluppo di canali.
La classe ChannelManagerBase implementa CommunicationObject e fornisce una classe di base unificata per System.ServiceModel.Channels.ChannelFactoryBase e System.ServiceModel.Channels.ChannelListenerBase. La classe ChannelManagerBase opera unitamente alla classe ChannelBase, una classe di base che implementa l'interfaccia IChannel.
La classe ChannelFactoryBase implementa ChannelManagerBase e IChannelFactory e consolida gli overload
CreateChannel
in un unico metodo astrattoOnCreateChannel
.La classe ChannelListenerBase implementa IChannelListener. Si occupa della gestione dello stato di base.
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
);