Dispatcher di canali personalizzati

L’esempio CustomChannelDispatcher illustra come compilare lo stack di canali in modo personalizzato implementando direttamente ServiceHostBase e come creare un dispatcher del canale personalizzato in un ambiente host Web. Il dispatcher del canale interagisce con IChannelListener per accettare canali e recupera messaggi dallo stack di canali. Questo esempio fornisce anche un esempio di base che illustra come compilare uno stack di canali in un ambiente host Web tramite VirtualPathExtension.

ServiceHostBase personalizzato

In questo esempio viene implementato il tipo di base ServiceHostBase anziché ServiceHost per illustrare come sostituire l'implementazione di stack di Windows Communication Foundation (WCF) con un livello di gestione dei messaggi personalizzato sopra lo stack di canali. Viene eseguito l'override del metodo virtuale InitializeRuntime per compilare i listener del canale e il dispatcher del canale.

Per implementare un servizio ospitato sul Web, ottenere l'estensione del servizio VirtualPathExtension dalla raccolta Extensions e aggiungerla a BindingParameterCollection in modo che il livello di trasporto sia in grado di configurare il listener del canale in base alle impostazioni dell'ambiente host, ovvero le impostazioni Internet Information Services (IIS)/servizio di attivazione dei processi di Windows.

Dispatcher di canali personalizzati

Il dispatcher del canale personalizzato estende il tipo ChannelDispatcherBase. Tale tipo implementa la logica di programmazione relativa al livello del canale. In questo esempio, solo IReplyChannel viene supportato per il modello di scambio di messaggi request/reply, ma il dispatcher del canale personalizzato può essere esteso facilmente ad altri tipi di canale.

Il dispatcher apre innanzitutto il listener del canale, quindi accetta il canale di risposta singleton. Con il canale, inizia a inviare messaggi (richieste) in un ciclo infinito. Per ogni richiesta, crea un messaggio di risposta e lo restituisce al client.

Creazione di un messaggio di risposta

L'elaborazione del messaggio viene implementata nel tipo MyServiceManager. Nel metodo HandleRequest, l'intestazione Action del messaggio viene dapprima controllata per verificare se la richiesta è supportata. Viene definita un'azione SOAP http://tempuri.org/HelloWorld/Hello predefinita per fornire il filtro dei messaggi. Ciò avviene in modo simile al concetto di contratto di servizio nell'implementazione WCF di ServiceHost.

Nel caso dell'azione SOAP corretta, l'esempio recupera i dati del messaggio richiesti e genera una risposta corrispondente alla richiesta in modo analogo a quanto si verifica nel caso di ServiceHost.

In questo caso, il verbo HTTP-GET viene gestito in modo speciale restituendo un messaggio HTML personalizzato, affinché sia possibile accedere al servizio da un browser per verificarne la corretta compilazione. Se l'azione SOAP non corrisponde, restituire un messaggio di errore per indicare che la richiesta non è supportata.

Il client di questo esempio è un normale client WCF che non presuppone nulla dal servizio. Pertanto, il servizio è progettato in modo specifico per individuare una corrispondenza tra ciò che si ottiene da una normale implementazione WCF di ServiceHost. Di conseguenza, nel client viene richiesto solo un contratto di servizio.

Utilizzo dell'esempio

L'esecuzione dell'applicazione client in modo diretto produce l'output seguente.

Client is talking to a request/reply WCF service.
Type what you want to say to the server: Howdy
Server replied: You said: Howdy. Message id: 1
Server replied: You said: Howdy. Message id: 2
Server replied: You said: Howdy. Message id: 3
Server replied: You said: Howdy. Message id: 4
Server replied: You said: Howdy. Message id: 5

È inoltre possibile accedere al servizio da un browser in modo che un messaggio HTTP-GET venga elaborato nel server. In questo modo, verrà restituito testo HTML formattato in modo corretto.