Partager via


Canaux

Les canaux sont des objets qui transportent des messages entre des applications au-delà des limites d'accès distant entre des domaines d'application, des processus ou des ordinateurs. Un canal peut écouter les messages entrants sur un point d'entrée, envoyer des messages sortants à un autre point d'entrée ou les deux. Cela vous permet d'intégrer un large éventail de protocoles même si le Common Language Runtime ne se trouve pas à l'autre bout du canal.

Les canaux doivent implémenter l'interface IChannel qui fournit des propriétés informationnelles telles que ChannelName et ChannelPriority. Les canaux conçus pour écouter un protocole particulier sur un port particulier implémentent IChannelReceiver et les canaux conçus pour envoyer des informations implémentent IChannelSender. Les objets TcpChannel et HttpChannel implémentent ces deux interfaces pour qu'elles soient utilisées pour envoyer ou recevoir des informations.

Vous pouvez inscrire des canaux à l'aide de l'infrastructure distante de deux façons :

  • Si vous publiez un objet accessible à distance, appelez ChannelServices.RegisterChannel avant d'inscrire votre objet serveur.
  • Si vous consommez les fonctionnalités d'un objet accessible à distance, appelez ChannelServices.RegisterChannel avant de créer une instance de votre objet serveur.

Les canaux peuvent également être chargés à partir du fichier de configuration d'accès distant. Pour plus d'informations, consultez Configuration.

Du côté client, les messages sont transmis à la chaîne de récepteurs de canal cliente après leur passage par la chaîne de contexte cliente. Le premier récepteur de canal est généralement un récepteur de formateur ; il sérialise le message dans un flux qui est ensuite passé au récepteur de transport client via la chaîne de récepteurs de canal. Le récepteur de transport client écrit ensuite ce flux sur le câble.

Du côté serveur, le récepteur de transport serveur lit les demandes provenant du câble et passe le flux de demande à la chaîne de récepteurs de canal serveur. Le récepteur de formateur serveur à la fin de cette chaîne désérialise la demande en message. Il passe ensuite ce message à l'infrastructure distante. Pour plus d'informations sur les chaînes de canal, consultez Récepteurs et chaînes de récepteurs.

Règles de canal

Lorsqu'un client appelle une méthode sur un objet distant, les paramètres et d'autres informations relatives à l'appel sont transportés par le canal à l'objet distant. Tous les résultats de l'appel sont retournés de la même manière. Un client peut sélectionner n'importe lequel des canaux inscrits sur le serveur pour communiquer avec l'objet distant, offrant ainsi aux développeurs la liberté de sélectionner les canaux qui correspondent le mieux à leurs besoins. Il est également possible de personnaliser tout canal existant ou d'en créer de nouveaux qui utilisent un protocole de communication différent. La sélection de canal est soumise aux règles suivantes :

  • Au moins un canal doit être inscrit à l'aide du système d'accès distant sur le serveur avant de pouvoir appeler un objet distant. Les canaux doivent être inscrits avant l'inscription des objets. Si un canal n'est pas inscrit sur le client, le système d'accès distant en choisira ou créera un pour effectuer des appels sortants.

    **Remarque   **Si le client s'attend à une fonction de rappel, un canal à l'écoute doit être inscrit sur le client et le serveur doit être configuré pour utiliser un canal compatible.

  • Les canaux sont inscrits par domaine d'application. Un processus unique peut contenir plusieurs domaines d'application. Lorsqu'un processus se termine, tous les canaux qu'il a inscrits sont automatiquement supprimés.

  • Les noms de canaux doivent être uniques dans un domaine d'application. Par exemple, comme les canaux par défaut possèdent des noms, pour inscrire deux objets HttpChannel dans un domaine d'application, vous devez changer les noms des canaux avant de les inscrire. L'exemple de code C# suivant illustre ce processus.

    IDictionary prop = new Hashtable();
    prop["name"] = "http1";
    prop["port"] = "9001";
    ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
    
  • Vous ne pouvez pas inscrire un canal qui écoute sur un port spécifique plus d'une fois. Même si les canaux sont inscrits par domaine d'application, différents domaines d'application sur le même ordinateur ne peuvent pas inscrire le même canal écoutant sur le même port.

  • Si vous n'êtes pas certain de la disponibilité d'un port, utilisez 0 (zéro) lors de la configuration du port de votre canal et le système d'accès distant choisira pour vous un port disponible.

  • Les clients peuvent communiquer avec un objet distant à l'aide de n'importe quel canal inscrit. Le système d'accès distant garantit que l'objet distant est connecté au bon canal lorsqu'un client tente de se connecter à l'objet. Le client est chargé d'appeler ChannelServices.RegisterChannel avant de tenter de communiquer avec un objet distant. S'il attend une fonction de rappel, le client doit inscrire un canal et un port.

Lorsqu'un client appelle une méthode sur un proxy, l'appel est intercepté, empaqueté dans un message et passé à une instance de la classe RealProxy. La classe RealProxy transmet le message au récepteur de message pour traitement. Un récepteur de message établit une connexion avec le canal inscrit par l'objet distant, et distribue le message sur le canal dans le domaine d'application d'origine. Le message est alors démarshalé et l'appel est effectué sur l'objet distant lui-même.

Lorsque l'accès distant initialise un proxy vers un objet distant dans le domaine du client, un récepteur de message capable de communiquer avec l'objet distant est extrait du canal configuré par le client en appelant IChannelSender.CreateMessageSink sur le canal sélectionné.

Un aspect déroutant du système d'accès distant est la relation entre les objets et les canaux distants. Par exemple, comment un objet distant WellKnownObjectMode.SingleCall écoute-t-il les clients qui se connectent, si l'objet n'est activé que lorsqu'un appel arrive ?

Cela est possible en partie grâce au fait que les objets distants partagent des canaux ; un objet distant ne possède pas de canal. Les applications serveur qui hébergent des objets distants doivent inscrire les canaux dont elles ont besoin ainsi que les objets qu'elles souhaitent exposer à l'aide du système d'accès distant. Lorsqu'un canal est inscrit, il commence automatiquement par écouter les demandes clientes à un port spécifié. Dans le cas des appels synchrones, la connexion à partir du client est maintenue pendant la durée de l'appel de message. Comme chaque connexion cliente est gérée dans son propre thread, un canal unique peut traiter plusieurs clients simultanément.

Voir aussi

Vue d'ensemble de .NET Remoting | HttpChannel | TcpChannel | Choix d'un canal | Formateurs de sérialisation | Récepteurs et chaînes de récepteurs