Partager via


Informations de version dans la communication à distance

Cette rubrique est spécifique à la technologie héritée assurant la compatibilité descendante avec des applications existantes et n'est pas recommandée en cas de nouveau développement. Les applications distribuées doivent maintenant être développées à l'aide de Windows Communication Foundation (WCF)

La communication à distance a été conçue pour utiliser des assemblys avec nom fort. Lorsque les noms forts sont utilisés avec la communication à distance, les règles de base suivantes s'appliquent :

  • Les versions sont toujours incluses avec la propriété TypeName d'une implémentation d'interface IMethodCallMessage.

  • Les versions sont toujours incluses avec la propriété ActivationTypeName d'une implémentation d'interface IConstructionCallMessage.

  • Les versions sont toujours incluses avec la propriété TypeInfo stockée dans les objets ObjRef.

  • Tout versioning dans la communication à distance est déterminé par la propriété includeVersions du formateur utilisé. Par défaut, l'objet BinaryFormatter génère des informations de versioning, mais pas l'objet SoapFormatter. Cette propriété peut être modifiée par un programme lors de la création d'un canal, ou définie via le fichier de configuration de communication à distance.

Cette section décrit comment ces règles affectent les références d'objet et les différents modèles d'activation communément utilisés dans la communication à distance.

Objets activés par le serveur

Le serveur vérifie quelle version du type est activée lorsqu'un client se connecte à un objet activé par le serveur (ou à un objet <wellknown>). Si aucune information de version n'est fournie lorsque le service est configuré, la dernière version de l'assembly est utilisée lors de l'activation de l'objet. Par exemple, si vous avez deux assemblys, MyHello version 1.0.0.0 et MyHello version 2.0.0.0, l'objet connu est activé à l'aide de l'assembly version 2.0 si aucune information de version n'est fournie. Il est important de noter que cette version est utilisée indépendamment de la version référencée lorsque le client a été généré.

Le service peut être configuré pour utiliser une version spécifique d'un assembly. Le fichier de configuration suivant montre comment spécifier une version. Notez que si un assembly se trouve dans le Global Assembly Cache, vous devez spécifier toutes les informations de type, y compris les informations de culture et la clé publique. Les exemples de configuration suivants omettent les informations de nom fort pour mettre l'accent sur le versioning.

<configuration>
<system.runtime.remoting>
   <application name="RemotingHello">
      <lifetime 
         leaseTime="20ms" 
         sponsorshipTimeOut="20ms"
         renewOnCallTime="20ms" 
      />
      <service>
         <wellknown 
            mode="SingleCall" 
            type="Hello.HelloService,MyHello,Version=1.0.0.0,<strong name omitted>"
            objectUri="HelloService.soap" 
         />
         <activated 
            type="Hello.AddService, MyHello"
         />
      </service>
      <channels>
         <channel 
            port="8000"
            ref="tcp"
         >
         </channel>
      </channels>
   </application>
</system.runtime.remoting>
</configuration>

Ce fichier spécifie que la version 1.0.0.0 de l'assembly MyHello doit être utilisée pour créer des objets pour ses clients. Lorsque plusieurs versions du même objet sont spécifiées au point de terminaison, la dernière version spécifiée est utilisée lors de l'activation de l'objet. Il est important de se souvenir que toute modification significative entre les versions d'un même objet peut avoir un effet négatif sur les clients. Si un paramètre de méthode est ajouté ou modifié entre deux versions, les clients compilés avec la version 1.0 lèvent une exception s'ils sont utilisés avec la version 2.0. C'est pourquoi il est recommandé d'héberger les nouvelles versions d'un objet sur un point de terminaison différent si elles apportent des changements significatifs.

Objets activés par le client

Lorsqu'un client active un objet activé par le client (autrement dit, un objet <activé>), un appel réseau est envoyé au serveur où l'objet demandé est activé et une référence à l'objet est retournée au client. Comme le client dirige l'activation de l'objet, il choisit également la version de l'objet qui va être activé. Par exemple, la version 1.0 de HelloService est activée sur le serveur si le client a été généré avec la version 1.0 de l'objet, et la version 2.0 de HelloService est activée sur le serveur si le client a été généré avec la version 2.0.

Il est important de noter que vous ne pouvez pas spécifier le numéro de version pour les types activés par le client lors de la configuration du service. De plus, toutes les informations de versioning fournies pour les types activés par le serveur n'ont aucun effet sur les objets activés par le client, même si les deux types sont dans le même assembly.

Par exemple, imaginons qu'un type activé par le client et un type activé par le serveur se trouvent dans le même assembly et que vous générez client1 avec la version 1.0 et client2 avec la version 2.0. Si aucune information de version n'est spécifiée pour l'objet activé par le serveur, client1 reçoit la version 2.0 de l'objet activé par le serveur et la version 1.0 de l'objet activé par le client. Client2 reçoit les objets de version 2.0 pour les types connus et pour les types activés.

Si vous configurez le service de façon à ce qu'il utilise la version 1.0 de l'assembly pour l'objet connu, les deux clients reçoivent la version 1.0 de l'objet connu, mais client1 reçoit la version 1.0 du type activé et client2 la version 2.0.

La version activée pour un client ne peut pas être configurée; la version avec laquelle le client a été généré est toujours utilisée.

Références d'objet

Les règles qui s'appliquent aux types activés par le serveur et à ceux activés par le client s'appliquent également aux références d'objet. Par exemple, lorsqu'un proxy pour un type activé par le client est passé comme paramètre d'un client à un autre ou d'un client au serveur, les informations de version incorporées dans la référence d'objet sont passées avec lui. Lorsque le récepteur essaie d'appeler une méthode sur le proxy généré à partir de la référence d'objet, la version incorporée dans la référence d'objet est prioritaire sur la version avec laquelle le client a été généré. Dans le cas d'objets activés par le serveur, le serveur impose la version utilisée et tous les clients qui reçoivent une référence d'objet en tant que paramètre communiquent avec la version spécifiée lorsque le service a été configuré. Si aucun versioning n'est présent, la version la plus récente est activée sur le serveur.

Objets marshalés par valeur

Lorsqu'un objet marshalé par valeur (MBV) est passé entre des domaines d'application, le formateur utilisé détermine si les informations de version sont incluses. Les objets BinaryFormatter incluent toujours la version, mais les objets SoapFormatter ignorent les informations de version. Cette option peut être activée ou désactivée pour les deux formateurs. Par exemple, si la ligne suivante est ajoutée au fichier de configuration, le SoapFormatter ajoute des informations de versioning lorsqu'il sérialise un objet.

<formatter ref="soap" includeVersions="true" />

Voir aussi

Concepts

Configuration d'applications distantes
Activation client
Activation serveur

Autres ressources

Vue d'ensemble de .NET Framework Remoting