Benutzerdefinierter KanalverteilerCustom Channel Dispatcher

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.This sample demonstrates how to build the channel stack in a custom way by implementing ServiceHostBase directly and how to create a custom channel dispatcher in Web host environment. Der Kanalverteiler interagiert mit IChannelListener, um Kanäle zu akzeptieren und ruft Nachrichten aus dem Kanalstapel ab.The channel dispatcher interacts with IChannelListener to accept channels and retrieves messages from the channel stack. Dieses Beispiel enthält auch ein einfaches Beispiel zur Veranschaulichung, wie ein Kanalstapel in einer Webhostumgebung mithilfe der VirtualPathExtension erstellt wird.This sample also provides a basic sample to show how to build a channel stack in a Web host environment by using VirtualPathExtension.

Benutzerdefinierte ServiceHostBaseCustom ServiceHostBase

In diesem Beispiel implementiert die Basistyp ServiceHostBase anstelle von ServiceHost veranschaulicht, wie Sie die Implementierung der Windows Communication Foundation (WCF)-Stapels durch eine benutzerdefinierte nachrichtenbehandlungsebene den Kanalstapel zu ersetzen.This sample implements the base type ServiceHostBase instead of ServiceHost to demonstrate how to replace the Windows Communication Foundation (WCF) stack implementation with a custom message handling layer on top of the channel stack. Sie überschreiben die virtuelle Methode InitializeRuntime, um Kanallistener und den Kanalverteiler zu erstellen.You override the virtual method InitializeRuntime to build channel listeners and the channel dispatcher.

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.To implement a Web-hosted service, get the service extension VirtualPathExtension from the Extensions collection and add it to the BindingParameterCollection so that the transport layer knows how to configure the channel listener based on the hosting environment settings, that is, the Internet Information Services (IIS)/Windows Process Activation Service (WAS) settings.

Benutzerdefinierter KanalverteilerCustom Channel Dispatcher

Der benutzerdefinierte Kanalverteiler erweitert den Typ ChannelDispatcherBase.The custom channel dispatcher extends the type ChannelDispatcherBase. Dieser Typ implementiert die Programmierlogik auf Kanalebene.This type implements the channel-layer programming logic. 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.In this sample, only IReplyChannel is supported for request-reply message exchange pattern, but the custom channel dispatcher can be easily extended to other channel types.

Der Verteiler öffnet zuerst den Kanallistener und akzeptiert dann den Singletonantwortkanal.The dispatcher first opens the channel listener and then accepts the singleton reply channel. Er beginnt mit dem Kanal mit dem Senden von Nachrichten (Anforderungen) in einer Endlosschleife.With the channel, it starts to send messages (requests) in an infinite loop. Für jede Anforderung erstellt er eine Antwortnachricht und sendet sie an den Client zurück.For each request, it creates a reply message and sends it back to the client.

Erstellen einer AntwortnachrichtCreating a Response Message

Die Nachrichtenverarbeitung wird im Typ MyServiceManager implementiert.The message processing is implemented in the type MyServiceManager. In der HandleRequest-Methode wird der Action-Header der Nachricht zuerst daraufhin überprüft, ob die Anforderung unterstützt wird.In the HandleRequest method, the Action header of the message is first checked to see whether the request is supported. Eine vordefinierte SOAP-Aktion "http://tempuri.org/HelloWorld/Hello" definiert ist, um die nachrichtenfilterung bereitzustellen.A predefined SOAP action "http://tempuri.org/HelloWorld/Hello" is defined to provide message filtering. Dieser Vorgang ähnelt dem dienstvertragskonzept in der WCF-Implementierung der ServiceHost.This is similar to the service contract concept in the WCF implementation of 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.For the correct SOAP action case, the sample retrieves the requested message data and generates a corresponding response to the request similar to what is seen in the ServiceHost case.

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.You specially handled the HTTP-GET verb by returning a custom HTML message, in this, case so that you can browse the service from a browser to see that it is compiled correctly. Wenn die SOAP-Aktion nicht richtig ist, senden Sie eine Fehlermeldung zurück, die angibt, dass die Anforderung nicht unterstützt wird.If the SOAP action does not match, send a fault message back to indicate that the request is not supported.

Der Client dieses Beispiels ist ein normaler WCF-Client, der nicht nichts vom Dienst übernimmt.The client of this sample is a normal WCF client that does not assume anything from the service. Also der Dienst ist speziell auf übereinstimmen, erhalten Sie von einem normalen WCFServiceHost Implementierung.So, the service is specially designed to match what you get from a normal WCFServiceHost implementation. Infolgedessen ist auf dem Client nur ein Dienstvertrag erforderlich.As a result, only a service contract is required on the client.

Verwenden des BeispielsUsing the sample

Wenn Sie die Clientanwendung ausführen, wird die folgende Ausgabe direkt erzeugt.Running the client application directly produces the following output.

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.You can also browse the service from a browser so that an HTTP-GET message gets processed on the server. Auf diese Weise wird wohlgeformter HTML-Text zurückgegeben.This gets you well-formatted HTML text back.

Wichtig

Die Beispiele sind möglicherweise bereits auf dem Computer installiert.The samples may already be installed on your machine. Suchen Sie nach dem folgenden Verzeichnis (Standardverzeichnis), bevor Sie fortfahren.Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Wenn dieses Verzeichnis nicht vorhanden ist, fahren Sie mit Windows Communication Foundation (WCF) und Windows Workflow Foundation (WF) Samples for .NET Framework 4 aller Windows Communication Foundation (WCF) herunterladen und WFWF Beispiele.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Dieses Beispiel befindet sich im folgenden Verzeichnis.This sample is located in the following directory.

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