Freigeben über


Channel

Channels sind Objekte, die Nachrichten über Remotinggrenzen hinweg zwischen Anwendungen übermitteln, unabhängig davon, ob es sich dabei um Anwendungsdomänen, Prozesse oder Computer handelt. Ein Channel kann einen Endpunkt auf eingehende Nachrichten überwachen und/oder ausgehende Nachrichten an einen anderen Endpunkt senden. Auf diese Weise können Sie die verschiedensten Protokolle einbinden, selbst wenn Common Language Runtime am anderen Ende des Channels nicht verfügbar ist.

Channel müssen die IChannel-Schnittstelle implementieren, die informative Eigenschaften wie ChannelName und ChannelPriority bereitstellt. Channels, die einen bestimmten Port auf ein bestimmtes Protokoll überwachen sollen, implementieren IChannelReceiver, während Channels, die auf das Senden von Informationen ausgelegt sind, IChannelSender implementieren. Die Objekte TcpChannel und HttpChannel implementieren beide Schnittstellen, sodass sie zum Senden und Empfangen von Informationen verwendet werden können.

Sie haben folgende Möglichkeiten, Channels bei der Remoteinfrastruktur zu registrieren:

  • Rufen Sie beim Veröffentlichen eines remotefähigen Objekts vor dem Registrieren des Serverobjekts ChannelServices.RegisterChannel auf.

  • Wenn Sie die Funktionen eines remotefähigen Objekts verwenden, rufen Sie RegisterChannel vor dem Erstellen einer Instanz des Serverobjekts auf.

Channels können auch aus der Remotekonfigurationsdatei geladen werden. Details finden Sie unter Konfiguration.

Auf der Clientseite werden Nachrichten an die Channelempfängerkette des Clients übergeben, nachdem sie die Kontextkette des Clients durchlaufen haben. Bei dem ersten Channelempfänger handelt es sich normalerweise um einen Formatierungsempfänger, der die Nachricht in einen Stream serialisiert, der dann die Channelempfängerkette zum Transportempfänger des Clients durchläuft. Anschließend wird dieser Stream durch den Transportempfänger des Clients in den Transport geschrieben.

Serverseitig liest die Transportempfänger des Servers Anforderungen aus dem Transport und übergibt den Anforderungsstream an die Channelempfängerkette des Servers. Die Formatierungsempfänger des Servers am Ende dieser Kette deserialisiert die Anforderung in eine Nachricht. Diese Nachricht wird dann an die Remoteinfrastruktur übergeben. Weitere Informationen zu Channelempfängern finden Sie unter Empfänger und Empfängerketten.

Channelregeln

Wenn ein Client eine Methode für ein Remoteobjekt aufruft, werden die Parameter und andere Aufrufdetails über den Channel an das Remoteobjekt übertragen. Alle Ergebnisse dieses Aufrufs werden auf demselben Weg zurückgegeben. Ein Client kann einen beliebigen, auf dem Server registrierten Channel für die Kommunikation mit dem Remoteobjekt auswählen. So können Entwickler den für ihre Anforderungen geeigneten Channel auswählen. Weiterhin ist es möglich, einen vorhandenen Channel anzupassen sowie neue Channels zu erstellen, die unterschiedliche Kommunikationsprotokolle verwenden. Die folgenden Regeln gelte für die Auswahl von Channels:

  • Zumindest ein Channel muss beim Remotingsystem auf dem Server registriert sein, bevor ein Remoteobjekt aufgerufen werden kann. Vor dem Registrieren von Objekten müssen Channels registriert werden. Ist ein Channel auf dem Client nicht registriert, wählt das Remotingsystem einen Channel zum Senden ausgehender Aufrufe aus bzw. erstellt einen neuen Channel.

    Hinweis

    Wenn der Client eine Rückruffunktion erwartet, muss auf dem Client ein überwachender Channel registriert sein, und der Server muss für die Verwendung eines kompatiblen Channels konfiguriert sein.

  • Channels werden pro Anwendungsdomäne registriert. Ein Prozess kann mehrere Anwendungsdomänen enthalten. Wenn ein Prozess beendet wird, werden automatisch alle von ihm registrierten Channels zerstört.

  • Channelnamen müssen innerhalb einer Anwendungsdomäne eindeutig sein. Da z. B. die Standardchannels benannt sind, müssen Sie, wenn Sie zwei HttpChannel-Objekte in einer Anwendungsdomäne registrieren möchten, vor dem Registrieren die Namen der Channels ändern. Dies wird im folgenden C#-Codebeispiel dargestellt.

    IDictionary prop = new Hashtable();
    prop["name"] = "http1";
    prop["port"] = "9001";
    ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
    
  • Sie können einen Channel, der einen bestimmten Port überwacht, nicht mehr als einmal registrieren. Obwohl Channels auf Basis von Anwendungsdomänen registriert werden, können unterschiedliche Anwendungsdomänen auf demselben Computer nicht denselben Channel registrieren, der denselben Port überwacht.

  • Falls Sie nicht wissen, ob ein Port verfügbar ist, verwenden Sie bei der Konfiguration des Anschlusses für den Channel 0 (Null). Daraufhin wählt das Remotingsystem automatisch einen verfügbaren Port aus.

  • Clients können mit einem Remoteobjekt über einen registrierten Channel kommunizieren. Das Remotingsystem stellt sicher, dass das Remoteobjekt mit dem richtigen Channel verbunden wird, wenn ein Client versucht, eine Verbindung mit dem Objekt herzustellen. Der Client ist dafür zuständig, vor der Kommunikation mit einem Remoteobjekt ChannelServices.RegisterChannel aufzurufen. Wenn eine Rückruffunktion erwartet wird, muss der Client einen Channel und einen Port registrieren.

Wenn ein Client eine Methode auf 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 Nachrichtenempfänger weiter. Ein Nachrichtenempfänger stellt eine Verbindung mit dem von dem Remoteobjekt registrierten Channel her und sendet die Nachricht über den Channel in die ursprüngliche Anwendungsdomäne. Dort wird das Marshallen der Nachricht rückgängig gemacht, und der Aufruf wird direkt für das Remoteobjekt ausgeführt.

Wenn beim Remoting ein Proxy für ein Remoteobjekt in der Domäne des Clients initialisiert wird, wird ein Nachrichtenempfänger, der zur Kommunikation mit dem Remoteobjekt fähig ist, über den vom Client konfigurierten Channel abgerufen, indem IChannelSender.CreateMessageSink für den ausgewählten Channel aufgerufen wird.

Ein etwas verwirrender Aspekt des Remotingsystems ist die Beziehung zwischen Remoteobjekten und Channels. Wie führt ein WellKnownObjectMode.SingleCall-Remoteobjekt z. B. eine Überwachung auf Verbindung herstellende Clients durch, wenn das Objekt nur bei einem eingehenden Aufruf aktiviert wird?

Dies ist z. T. dadurch möglich, dass Remoteobjekte Channels gemeinsam nutzen, ein Remoteobjekt also keinen Channel besitzt. Serveranwendungen, die als Host für Remoteobjekte dienen, müssen sowohl die erforderlichen Channels als auch die Objekte registrieren, die sie mit dem Remotingsystem verfügbar machen möchten. Wenn ein Channel registriert wird, beginnt dieser automatisch mit dem Überwachen des angegebenen Ports auf Clientanforderungen. Bei synchronen Aufrufen wird die Verbindung vom Client für die Dauer des Nachrichtenaufrufs aufrecht erhalten. Da jede Clientverbindung in einem eigenen Thread behandelt wird, kann ein einzelner Channel mehrere Clients gleichzeitig bedienen.

Siehe auch

Referenz

HttpChannel
TcpChannel

Konzepte

Auswählen eines Channels
Serialisierungsformatierung
Empfänger und Empfängerketten

Weitere Ressourcen

Übersicht über .NET Framework Remoting