Client: Channel Factory e Canali

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.

Client Factory e canali 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 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
);

Vedere anche