Freigeben über


Dienst-Kanalebenenprogrammierung

In diesem Thema wird das Schreiben einer Windows Communication Foundation (WCF) Dienstanwendung ohne Verwenden des System.ServiceModel.ServiceHost und der zugehörigen Objektmodelle beschrieben.

Empfangen von Meldungen

Um bereit zu sein, Meldungen zu empfangen und zu verarbeiten, sind die folgenden Schritte erforderlich:

  1. Erstellen Sie eine Bindung.
  2. Erstellen Sie einen Kanallistener.
  3. Öffnen Sie den Kanallistener.
  4. Lesen Sie die Anforderung, und senden Sie eine Antwort.
  5. Schließen Sie alle Kanalobjekte.

Erstellen einer Bindung

Der erste Schritt beim Überwachen und Empfangen von Meldungen ist das Erstellen einer Bindung. WCF wird mit verschiedenen integrierten und vom System bereitgestellten Bindungen ausgeliefert, die direkt durch Instanziierung verwendet werden können. Außerdem können Sie eigene benutzderdefinierte Bindungen durch Instanziieren einer CustomBinding-Klasse erstellen. Diese Aufgabe übernimmt beispielsweise der Code im Programmbeispiel 1.

Das Codebeispiel unten erstellt eine Instanz von System.ServiceModel.Channels.CustomBinding und fügt ein System.ServiceModel.Channels.HttpTransportBindingElement zur Elementesammlung hinzu, die einer Sammlung von Bindungselementen entspricht, die zum Erstellen des Kanalstapels verwendet werden. Da die Elementesammlung in diesem Beispiel nur das HttpTransportBindingElement aufweist, hat der resultierende Kanalstapel nur einen HTTP-Transportkanal.

Erstellen eines Kanallisteners.

Nach dem Erstellen einer Bindung wird System.ServiceModel.Channels.Binding.BuildChannelListener.Uri,System.ServiceModel.Channels.BindingParameterCollection) aufgerufen, um den Kanallistener zu erstellen, wobei der Typparameter der zu erstellenden Kanalform entspricht. In diesem Beispiel wird System.ServiceModel.Channels.IReplyChannel verwendet, da eingehende Meldungen in einem Anforderungs-/Antwort-Meldungsaustauschmuster abgehört werden sollen.

IReplyChannel wird zum Empfangen von Anforderungsmeldungen und Senden von Antwortnachrichten verwendet. Durch das Aufrufen von System.ServiceModel.Channels.IReplyChannel.ReceiveRequest wird ein System.ServiceModel.Channels.IRequestChannel zurückgegeben, der zum Empfang der Anforderungsmeldung und zum Senden einer Antwortmeldung verwendet werden kann.

Beim Erstellen des Listeners wird die Netzwerkadresse übergeben, auf der er überwacht, in diesem Fall https://localhost:8080/channelapp. Allgemein unterstützt jeder Transportkanal mindestens ein Adressenschema. So unterstützt beispielsweise der HTTP-Transport HTTP- und HTTPS-Schemas.

Außerdem wird beim Erstellen des Listeners eine leere System.ServiceModel.Channels.BindingParameterCollection übergeben. Ein Bindungsparameter ist ein Mechanismus, um Parameter zu übergeben, die steuern, wie der Listener erstellt werden soll. In diesem Beispiel werden keine solchen Parameter verwendet, daher wird eine leere Auflistung übergeben.

Überwachen von eingehenden Nachrichten

Dann wird System.ServiceModel.ICommunicationObject.Open auf dem Listener aufgerufen und damit begonnen, Kanäle zu akzeptieren. Das Verhalten von System.ServiceModel.Channels.IChannelListener.AcceptChannel hängt davon ab, ob der Transport verbindungsorientiert oder verbindungslos ist. Bei einem verbindungsorientierten Transport blockiert AcceptChannel, bis eine neue Verbindungsanforderung eingeht. Dann wird ein neuer Kanal zurückgegeben, der diese neue Verbindung darstellt. Bei einem verbindungslosen Transport, wie z. B. HTTP, gibt AcceptChannel unverzüglich den einzigen Kanal zurück, den der Transportlistener erstellt.

In diesem Beispiel gibt der Listener einen Kanal zurück, der IReplyChannel implementiert. Um Meldungen auf diesem Kanal zu empfangen, wird zuerst System.ServiceModel.ICommunicationObject.Open aufgerufen, um ihn in einen kommunikationsbereiten Status zu versetzen. Dann wird ReceiveRequest aufgerufen, der blockiert, bis eine Nachricht eingeht.

Lesen der Anforderung und Senden einer Antwort

Wenn ReceiveRequest einen RequestContext zurückgibt, geht die empfangene Meldung mithilfe der RequestMessage-Eigenschaft ein. Die Aktion und der Textinhalt der Meldung (es wird angenommen, dass es sich um eine Zeichenfolge handelt) wird geschrieben.

Zum Senden einer Antwort wird eine neue Antwortmeldung erstellt, in diesem Fall durch Zurücksenden der Zeichenfolgendaten, die in der Anforderung eingegangen sind. Dann wird Reply aufgerufen, um die Antwortmeldung zu senden.

Schließen von Objekten

Um Ressourcenverluste zu vermeiden, sollten Sie in Kommunikationsvorgängen verwendete Objekte schließen, wenn sie nicht mehr benötigt werden. In diesem Beispiel werden die Anforderungsmeldung, der Anforderungskontext, der Kanal und der Listener geschlossen.

Im folgenden Codebeispiel wird ein grundlegender Dienst, in dem ein Kanallistener nur eine Nachricht empfängt, veranschaulicht. Ein wirklicher Dienst akzeptiert Kanäle und empfängt Meldungen, bis der Dienst beendet wird.