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.
In questo argomento viene descritta la creazione di channel factory e canali.
Channel Factory e canali
Le channel factory sono responsabili della creazione di canali. I canali creati dalle channel factory vengono usati per l'invio di messaggi. Questi canali sono responsabili del recupero del messaggio dal livello precedente, eseguendo qualsiasi elaborazione necessaria, quindi inviando il messaggio al livello sottostante. L'immagine seguente illustra questo processo.
Una channel factory crea canali.
Quando vengono chiuse, le channel factory sono responsabili della chiusura di tutti i canali creati che non sono ancora chiusi. Si noti che il modello è asimmetrico perché quando un listener del canale viene chiuso, interrompe solo l'accettazione di nuovi canali ma lascia aperti i canali esistenti in modo che possano continuare a ricevere messaggi.
WCF fornisce helper della classe di base per questo processo. Per un diagramma delle classi helper del canale descritte in questo argomento, vedere Panoramica del modello di canale.
La CommunicationObject classe implementa ICommunicationObject e applica la macchina a stati descritta nel passaggio 2 di Sviluppo di canali.
La ChannelManagerBase classe implementa CommunicationObject e fornisce una classe base unificata per System.ServiceModel.Channels.ChannelFactoryBase e System.ServiceModel.Channels.ChannelListenerBase. La ChannelManagerBase classe funziona insieme a ChannelBase, che è una classe di base che implementa IChannel.
La ChannelFactoryBase classe implementa ChannelManagerBase e IChannelFactory e consolida i
CreateChannelsovraccarichi in un unicoOnCreateChannelmetodo astratto.La ChannelListenerBase classe implementa IChannelListener. Si occupa della gestione dello stato di base.
La discussione seguente si basa sull'esempio Transport: UDP .
Creazione di una channel factory
Il UdpChannelFactory deriva da ChannelFactoryBase. L'esempio esegue l'override GetProperty per fornire l'accesso alla versione del messaggio del codificatore di messaggi. L'esempio esegue anche l'override OnClose per rimuovere l'istanza di BufferManager quando viene eseguita la transizione della macchina a stati.
Canale di output UDP
Il UdpOutputChannel implementa IOutputChannel. Il costruttore convalida gli argomenti e costruisce un oggetto di destinazione EndPoint in base all'oggetto EndpointAddress passato.
L'override di OnOpen crea un socket utilizzato per inviare messaggi a questo oggetto EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
Il canale può essere chiuso normalmente o disgraziatamente. Se il canale viene chiuso normalmente, il socket viene chiuso e viene effettuata una chiamata al metodo della classe OnClose base. Se viene generata un'eccezione, l'infrastruttura chiama Abort per assicurarsi che il canale venga pulito.
this.socket.Close();
base.OnClose(timeout);
Implementare Send() e BeginSend()/EndSend(). Questa operazione si suddivide in due sezioni principali. Serializzare prima il messaggio in una matrice di byte:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Quindi invia i dati risultanti sulla rete.
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);