Benutzerdefinierter Kanalverteiler

Im CustomChannelDispatcher-Beispiel wird gezeigt, wie der Kanalstapel auf benutzerdefinierte Weise erstellt wird, indem ServiceHostBase direkt implementiert wird, und wie ein benutzerdefinierter Kanaldispatcher in einer Webhostumgebung erstellt wird. Der Kanalverteiler interagiert mit IChannelListener, um Kanäle zu akzeptieren und ruft Nachrichten aus dem Kanalstapel ab. Dieses Beispiel enthält auch ein einfaches Beispiel zur Veranschaulichung, wie ein Kanalstapel in einer Webhostumgebung mithilfe der VirtualPathExtension erstellt wird.

Benutzerdefinierte ServiceHostBase

In diesem Beispiel wird der Basistyp ServiceHostBase anstelle von ServiceHost implementiert, um zu zeigen, wie die WCF-Stapelimplementierung (Windows Communication Foundation) durch eine benutzerdefinierte Nachrichtenbehandlungsebene über dem Kanalstapel ersetzt wird. Sie überschreiben die virtuelle Methode InitializeRuntime, um Kanallistener und den Kanalverteiler zu erstellen.

Um einen im Internet gehosteten Dienst zu implementieren rufen Sie die Diensterweiterung VirtualPathExtension aus der Extensions-Auflistung ab, und fügen Sie sie zur BindingParameterCollection hinzu, damit die Transportebene den Kanallistener basierend auf den Hostumgebungseinstellungen, d. h. den Einstellungen für die Internetinformationsdienste (IIS) und den Windows-Prozessaktivierungsdienst (WAS), konfigurieren kann.

Benutzerdefinierter Kanalverteiler

Der benutzerdefinierte Kanalverteiler erweitert den Typ ChannelDispatcherBase. Dieser Typ implementiert die Programmierlogik auf Kanalebene. In diesem Beispiel wird nur IReplyChannel für das Anforderung-Antwort-Nachrichtenaustauschmuster unterstützt, aber der benutzerdefinierte Kanalverteiler kann schnell auf andere Kanaltypen erweitert werden.

Der Verteiler öffnet zuerst den Kanallistener und akzeptiert dann den Singletonantwortkanal. Er beginnt mit dem Kanal mit dem Senden von Nachrichten (Anforderungen) in einer Endlosschleife. Für jede Anforderung erstellt er eine Antwortnachricht und sendet sie an den Client zurück.

Erstellen einer Antwortnachricht

Die Nachrichtenverarbeitung wird im Typ MyServiceManager implementiert. In der HandleRequest-Methode wird der Action-Header der Nachricht zuerst daraufhin überprüft, ob die Anforderung unterstützt wird. Eine vordefinierte SOAP-Aktion http://tempuri.org/HelloWorld/Hello wird definiert, um die Nachrichtenfilterung bereitzustellen. Dies ähnelt dem Dienstvertragskonzept in der WCF-Implementierung von ServiceHost.

Im Beispiel werden für den richtigen SOAP-Aktionsfall die angeforderten Nachrichtendaten abgerufen, und es wird eine entsprechende Antwort auf die Anforderung generiert, ähnlich dem ServiceHost-Fall.

Sie haben das HTTP-GET-Verb in diesem Fall besonders behandelt und eine benutzerdefinierte HTML-Nachricht zurückgegeben, damit Sie den Dienst in einem Browser durchsuchen können, um sicherzustellen, dass er ordnungsgemäß kompiliert wurde. Wenn die SOAP-Aktion nicht richtig ist, senden Sie eine Fehlermeldung zurück, die angibt, dass die Anforderung nicht unterstützt wird.

Der Client in diesem Beispiel ist ein normaler WCF-Client, der nichts vom Dienst übernimmt. Der Dienst wurde also speziell entworfen, um den Ergebnissen einer normalen WCF-Implementierung von ServiceHost zu entsprechen. Infolgedessen ist auf dem Client nur ein Dienstvertrag erforderlich.

Verwenden des Beispiels

Wenn Sie die Clientanwendung ausführen, wird die folgende Ausgabe direkt erzeugt.

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

Sie können den Dienst auch in einem Browser durchsuchen, damit eine HTTP-GET-Nachricht auf dem Server verarbeitet wird. Auf diese Weise wird wohlgeformter HTML-Text zurückgegeben.