Freigeben über


Benutzerdefinierter Kanalverteiler

In diesem Beispiel wird gezeigt, wie der Kanalstapel auf benutzerdefinierte Weise erstellt wird, indem ServiceHostBase direkt implementiert wird, und wie ein benutzerdefinierter Kanalverteiler 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 statt dem ServiceHost implementiert, um zu zeigen, wie die Windows Communication Foundation (WCF)-Stapelimplementierung 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 dieses Beispiels ist ein normaler WCF-Client, der nichts vom Dienst übernimmt. Der Dienst wurde also speziell entworfen, um den Ergebnissen einer normalen WCF ServiceHost-Implementierung 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 kommuniziert mit einem Anforderung-Antwort-WCF-Dienst. 
Geben Sie die gewünschte Nachricht für den Server ein: Howdy
Serverantwort: You said: Howdy. Nachrichten-ID: 1
Serverantwort: You said: Howdy. Nachrichten-ID: 2
Serverantwort: You said: Howdy. Nachrichten-ID: 3
Serverantwort: You said: Howdy. Nachrichten-ID: 4
Serverantwort: You said: Howdy. Nachrichten-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.

Ee943696.Important(de-de,VS.100).gif Hinweis:
Die Beispiele sind möglicherweise bereits auf dem Computer installiert. Überprüfen Sie das folgende (standardmäßige) Verzeichnis, bevor Sie fortfahren.

<Installationslaufwerk>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, rufen Sie Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 auf, um alle Windows Communication Foundation (WCF)- und WF-Beispiele herunterzuladen. Dieses Beispiel befindet sich im folgenden Verzeichnis.

<Installationslaufwerk>:\WF_WCF_Samples\WCF\Extensibility\Channels\CustomChannelDispatcher