Partager via


Custom Channel Dispatcher

L’exemple CustomChannelDispatcher montre comment générer la pile de canaux de façon personnalisée en implémentant ServiceHostBase directement et comment créer un répartiteur de canal personnalisé dans un environnement avec hôte web. Le répartiteur de canal interagit avec IChannelListener pour accepter des canaux et récupère des messages de la pile de canaux. Cet exemple fournit également un exemple de base pour montrer comment construire une pile de canaux dans un environnement avec hôte Web à l'aide de VirtualPathExtension.

Custom ServiceHostBase

Cet exemple implémente le type de base ServiceHostBase au lieu de ServiceHost pour montrer comment remplacer l’implémentation de pile Windows Communication Foundation (WCF) par une couche personnalisée de gestion des messages en plus de la pile de canaux. Vous devez substituer la méthode virtuelle InitializeRuntime pour générer des écouteurs de canal et le répartiteur de canal.

Pour implémenter un service hébergé sur le Web, obtenez l’extension de service VirtualPathExtension de la collection Extensions et ajoutez-la au BindingParameterCollection afin que la couche transport sache comment configurer l’écouteur de canal selon les paramètres de l’environnement d’hébergement, à savoir, les paramètres Internet Information Services (IIS) et ceux du service d’activation des processus Windows (WAS).

Custom Channel Dispatcher

Le répartiteur de canal personnalisé étend le type ChannelDispatcherBase. Ce type implémente la logique de programmation de la couche du canal. Dans cet exemple, seul IReplyChannel est pris en charge pour le modèle d'échange de messages demande/réponse, mais le répartiteur de canal personnalisé peut facilement être étendu à d'autres types de canaux.

Le répartiteur ouvre d'abord l'écouteur de canal, puis accepte le canal de réponse singleton. Avec le canal, il commence à envoyer des messages (demandes) dans une boucle infinie. Pour chaque demande, il crée un message de réponse qu'il renvoie au client.

Création d'un message de réponse

Le traitement des messages est implémenté dans le type MyServiceManager. Dans la méthode HandleRequest, l'en-tête Action du message est vérifié en premier pour voir si la demande est prise en charge. Une action SOAP prédéfinie http://tempuri.org/HelloWorld/Hello est définie pour fournir le filtrage des messages. Ce concept est similaire à celui du contrat de service dans l’implémentation WCF de ServiceHost.

Pour le cas de l'action SOAP appropriée, l'exemple récupère les données de message demandées et génère une réponse correspondante à la demande similaire à celle du cas ServiceHost.

Vous avez géré le verbe HTTP-GET de manière spéciale en retournant un message HTML personnalisé dans ce cas, aussi pouvez-vous parcourir le service à partir d'un navigateur et vérifier qu'il est correctement compilé. Si l'action SOAP ne correspond pas, renvoyez un message d'erreur pour indiquer que la demande n'est pas prise en charge.

Le client de cet exemple est un client WCF normal qui n’effectue aucune supposition par rapport au service. Le service est donc conçu spécialement pour correspondre à ce que vous obtenez d’une implémentation normale de WCFServiceHost. Par conséquent, seul un contrat de service est obligatoire sur le client.

Utilisation de l'exemple

L'exécution de l'application cliente produit directement la sortie suivante.

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

Vous pouvez également parcourir le service à partir d'un navigateur afin qu'un message HTTP-GET soit traité sur le serveur. Vous obtenez un texte HTML correctement mis en forme.