Freigeben über


Channels

Dieses Thema bezieht sich auf eine veraltete Technologie, die zum Zwecke der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten wird und nicht für die neue Entwicklung empfohlen wird. Verteilte Anwendungen sollten jetzt mit  Windows Communication Foundation (WCF) entwickelt werden.

Channels sind Objekte, die Nachrichten zwischen Anwendungen über Remotegrenzen hinweg übermitteln, sei es zwischen Anwendungsdomänen, Prozessen oder Computern. Ein Channel kann einen Endpunkt auf eingehende Nachrichten überwachen und/oder ausgehende Nachrichten an einen anderen Endpunkt senden. Dadurch können Sie eine Vielzahl von Protokollen einbinden, selbst wenn am anderen Ende des Channels keine Common Language Runtime vorhanden ist.

Channels müssen die IChannel-Schnittstelle implementieren, die informative Eigenschaften wie ChannelName und ChannelPriority bereitstellt. Channels, die zur Überwachung auf ein bestimmtes Protokoll konzipiert sind, implementieren IChannelReceiver, und Channels, die zum Senden von Informationen konzipiert sind, implementieren IChannelSender. Das TcpChannel-Objekt und das HttpChannel-Objekt implementieren beide Schnittstellen, sodass sie zum Senden und Empfangen von Informationen verwendet werden können.

Sie können Channels auf folgende Arten bei der Remoteinfrastruktur registrieren:

  • Wenn Sie ein remotefähiges Objekt veröffentlichen, rufen Sie ChannelServices.RegisterChannel auf, bevor Sie das Serverobjekt registrieren.

  • Wenn Sie die Funktionalität eines remotefähigen Objekts verwenden, rufen Sie RegisterChannel auf, bevor Sie eine Instanz des Serverobjekts erstellen.

Channels können auch aus der Remotekonfigurationsdatei geladen werden. Ausführliche Informationen zu diesem Thema finden Sie unter Konfiguration.

Auf der Clientseite werden Nachrichten an die Channelsenkenkette des Clients übergeben, nachdem sie die Kontextkette des Clients durchlaufen haben. Die erste Channelsenke ist in der Regel eine Formatierungssenke. Diese Senke serialisiert die Nachricht in einen Stream, der anschließend die Channelsenkenkette bis zur Transportsenke des Clients durchläuft. Anschließend wird dieser Stream durch die Transportsenken des Clients zur Übertragung geschrieben.

Serverseitig liest die Transportsenke des Servers Anforderungen aus der Übertragung und übergibt den Anforderungsstream an die Channelsenkenkette des Servers. Die Formatierungssenke des Servers am Ende dieser Kette deserialisiert die Anforderung in eine Nachricht. Er übergibt diese Nachricht anschließend an die Remoteinfrastruktur. Weitere Informationen über Channelsenken finden Sie unter Senken und Senkenketten.

Channelregeln

Wenn ein Client eine Methode für ein Remoteobjekt aufruft, werden die Parameter sowie weitere, den Aufruf betreffende Details über den Channel zum Remoteobjekt übertragen. Alle Ergebnisse des Aufrufs werden auf die gleiche Weise zurückgegeben. Ein Client kann jeden Channel, der auf dem Server registriert ist, für die Kommunikation mit dem Remoteobjekt wählen, sodass Entwickler die am besten für ihre Anforderungen geeigneten Channels auswählen können. Es ist außerdem möglich, die bestehenden Channels anzupassen oder neue Channels zu erstellen, die ein anderes Kommunikationsprotokoll verwenden. Die Channelauswahl unterliegt den folgenden Regeln:

  • Mindestens ein Channel muss beim Remotesystem auf dem Server registriert sein, bevor ein Remoteobjekt aufgerufen werden kann. Channels müssen vor Objekten registriert werden. Wenn kein Channel auf dem Client registriert ist, wählt das Remotesystem einen Channel aus oder es erstellt einen Channel, um ausgehende Aufrufe zu senden.

    dkfd3wha.note(de-de,VS.100).gifHinweis:
    Wenn der Client eine Rückruffunktion erwartet, muss auf dem Client ein Überwachungschannel registriert und der Server muss für die Verwendung eines kompatiblen Channels konfiguriert werden.

  • Channels werden pro Anwendungsdomäne registriert. Ein einzelner Prozess kann mehrere Anwendungsdomänen enthalten. Wenn ein Prozess endet, werden alle von ihm registrierten Channels automatisch gelöscht.

  • Channelnamen müssen innerhalb einer Anwendungsdomäne eindeutig sein. Da die Standardchannels Namen besitzen, müssen Sie die Namen der Channels vor deren Registrierung ändern, um beispielsweise zwei HttpChannel-Objekte in einer Anwendungsdomäne zu registrieren. Dies wird im folgenden C#-Codebeispiel veranschaulicht.

    IDictionary prop = new Hashtable();
    prop["name"] = "http1";
    prop["port"] = "9001";
    ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
    
  • Sie können keinen Channel registrieren, der einen bestimmten Anschluss mehr als einmal überwacht. Auch wenn Channels pro Anwendungsdomäne registriert sind, können verschiedene Anwendungsdomänen auf einem einzelnen Computer nicht die gleiche Channelüberwachung auf demselben Anschluss registrieren.

  • Wenn Sie nicht sicher sind, ob ein Anschluss verfügbar ist, verwenden Sie beim Konfigurieren des Channelanschlusses den Wert 0 (null). Das Remotesystem wählt dann einen verfügbaren Anschluss für Sie aus.

  • Clients können über jeden registrierten Channel mit einem Remoteobjekt kommunizieren. Wenn ein Client eine Verbindung mit einem Remoteobjekt herzustellen versucht, stellt das Remotesystem sicher, dass das Remoteobjekt mit dem richtigen Channel verbunden wird. Der Client ist vor dem Versuch, mit einem Remoteobjekt zu kommunizieren, für das Aufrufen von ChannelServices.RegisterChannel verantwortlich. Wenn der Client eine Rückruffunktion erwartet, muss er einen Channel und einen Anschluss registrieren.

Wenn ein Client eine Methode für einen Proxy aufruft, wird der Aufruf abgefangen, in einer Nachricht gebündelt und an eine Instanz der RealProxy-Klasse übergeben. Die RealProxy-Klasse leitet die Nachricht zur Verarbeitung an den Nachrichtensenken weiter. Eine Nachrichtensenke stellt eine Verbindung mit dem Channel her, der durch das Remoteobjekt registriert wurde, und sendet die Nachricht über den Channel zur ursprünglichen Anwendungsdomäne. Dort wird das Marshalling der Nachricht rückgängig gemacht, und der Aufruf wird am Remoteobjekt selbst ausgeführt.

Wenn Remoting einen Proxy zu einem Remoteobjekt in der Domäne des Clients initialisiert, wird eine Nachrichtensenke, die mit dem Remoteobjekt kommunizieren kann, aus dem vom Client konfigurierten Channel abgerufen, indem IChannelSender.CreateMessageSink für den ausgewählten Channel aufgerufen wird.

Ein verwirrender Aspekt des Remotesystems ist die Beziehung zwischen Remoteobjekten und Channels. Ein Beispiel dafür ist die Art und Weise, in der ein WellKnownObjectMode.SingleCall-Remoteobjekt darauf wartet, dass Clients eine Verbindung herstellen, wenn das Objekt nur bei Eintreffen eines Aufrufs aktiviert wird.

Dies ist zum Teil möglich, weil die Remoteobjekte Channels freigeben. Ein Remoteobjekt besitzt keinen Channel. Serveranwendungen, die Remoteobjekte hosten, müssen die erforderlichen Channels sowie die Objekte, die sie verfügbar machen, beim Remotesystem registrieren. Nachdem ein Channel registriert wurde, beginnt er automatisch damit, den angegebenen Anschluss auf Clientanforderungen zu überwachen. Bei synchronen Aufrufen wird die Verbindung des Clients für die Dauer des Nachrichtenaufrufs aufrecht erhalten. Da jede Clientverbindung in einem eigenen Thread behandelt wird, kann ein einziger Channel mehrere Clients gleichzeitig bedienen.

Siehe auch

Verweis

HttpChannel
TcpChannel

Konzepte

Auswählen eines Channels
Serialisierungsformatierung
Senken und Senkenketten

Weitere Ressourcen

Übersicht über .NET Framework-Remoting