Freigeben über


Channel

Channels sind Objekte, die Nachrichten über Remotegrenzen 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 die 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 bereitstellen. Channels, die darauf ausgelegt sind, einen bestimmten Anschluss auf ein bestimmtes Protokoll zu überwachen, implementieren IChannelReceiver, während Channels, die auf das Senden von Informationen ausgelegt sind, IChannelSender implementieren. Sowohl TcpChannel-Objekte als auch HttpChannel-Objekte implementieren beide Schnittstellen, so dass sie zum Senden und Empfangen von Informationen verwendet werden können.

Sie haben zwei Möglichkeiten, Channels bei der Remotinginfrastruktur 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 ChannelServices.RegisterChannel vor dem Erstellen einer Instanz des Serverobjekts auf.

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

Auf der Clientseite werden Nachrichten an die Channelempfängerkette des Clients übergeben, nachdem sie die Kontextkette des Clients durchlaufen haben. Beim 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 zur Übertragung über die Verbindung geschrieben.

Serverseitig liest der Transportempfänger des Servers Anforderungen aus der Übertragung und übergibt den Anforderungsstream an die Channelempfängerkette des Servers. Der Formatierungsempfänger des Servers am Ende dieser Kette deserialisiert die Anforderung in eine Nachricht. Diese Nachricht wird dann an die Remotinginfrastruktur ü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, wodurch Entwickler den für ihre Anforderungen geeigneten Channel wählen können. Weiterhin ist es möglich, einen vorhandenen Channel anzupassen sowie neue Channels zu erstellen, die unterschiedliche Kommunikationsprotokolle verwenden. Die folgenden Regeln betreffen 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 Überwachungschannel 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 Anschluss ü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 Anschluss überwacht.

  • Falls Sie nicht wissen, ob ein Anschluss 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 Anschluss 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 zu 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 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 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 Remoting einen Proxy für ein Remoteobjekt in der Domäne des Clients initialisiert, 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 offen legen möchten. Wenn ein Channel registriert wird, beginnt dieser automatisch mit dem Überwachen des angegebenen Anschlusses 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 versorgen.

Siehe auch

Übersicht über .NET Remoting | HttpChannel | TcpChannel | Auswählen eines Channels | Formatierungsprogramme für die Serialisierung | Empfänger und Empfängerketten