Informations de version dans l'accès distant
L'accès distant a été conçu pour fonctionner avec des assemblys avec nom fort. Lorsque des noms forts sont utilisés avec l'accès distant, 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 des objets ObjRef.
Tout autre versioning dans l'accès distant 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 changée par programme lorsqu'un canal est créé ou elle peut être définie à l'aide du fichier de configuration d'accès distant.
Cette section décrit comment ces règles affectent les références d'objet et les différents modèles d'activation utilisés le plus souvent dans l'accès distant.
Objets activés par le serveur :
Le serveur contrôle quelle version d'un type est activée lorsqu'un client se connecte à un objet activé par le serveur (ou <wellknown>). Si aucune information de version n'est fournie lorsque le service est configuré, la version la plus récente de l'assembly est utilisée lorsque l'objet est activé. 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 si aucune information de version n'est fournie. Il faut noter que cette version est utilisée quelle que soit 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. Par exemple, le fichier de configuration suivant montre comment spécifier une version. Notez que si l'assembly figure dans le Global Assembly Cache, vous devez spécifier toutes les informations se rapportant au type, notamment les informations de culture et la clé publique. Les exemples de configuration suivants omettent les informations de nom fort, de manière à mettre en évidence les informations de 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 niveau du point d'entrée, la dernière version spécifiée est utilisée lorsque l'objet est activé. Il est important de garder à l'esprit que tout changement significatif entre les versions du même objet peut avoir des conséquences regrettables sur les clients. Si un paramètre de méthode est ajouté ou modifié entre les versions, les clients compilés avec la version 1 lèvent une exception lors de leur utilisation avec la version 2. Il est donc recommandé qu'une nouvelle version d'un objet soit hébergée à un point d'entrée différent lorsque des changements importants ont eu lieu entre les versions.
Objets activés par le client :
Lorsqu'un client active un objet activé par le client (c'est-à-dire <activated>), un appel réseau est envoyé immédiatement au serveur où l'objet demandé est activé et une référence d'objet à l'objet est retournée au client. Comme il dirige l'activation de l'objet, le client choisit également la version de l'objet qui doit être activée. Par exemple, la version 1 de HelloService sera activée sur le serveur si le client a été généré avec la version 1 de l'objet, et version 2 de HelloService sera activée sur le serveur si le client a été généré avec la version 2.
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 lorsque le service est configuré. De même, toute information de versioning fournie pour les types activés par le serveur n'a 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 que vous avez un type activé par le client et un type activé par le serveur dans le même assembly et que vous générez le client1 avec la version 1 et le client2 avec la version 2. Si aucune information de version n'est spécifiée pour l'objet activé par le serveur, le client 1 recevra la version 2 de l'objet activé par le serveur et la version 1 de l'objet activé par le client. Le client2 recevra les objets de la version 2 pour les types connus et activés.
Si vous configurez le service pour utiliser la version 1 de l'assembly pour l'objet connu, les deux clients recevront la version 1 de l'objet connu tandis que le client 1 reçoit la version 1 du type activé et le client 2 reçoit la version 2 du type activé.
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 mêmes règles qui s'appliquent aux types activés par le client et les types activés par le serveur 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 client, ou d'un client au serveur, les informations de version incorporées dans la référence d'objet sont passées en même temps. Lorsque le destinataire tente 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 dicte la version qui sera utilisée et tous les clients qui reçoivent une référence d'objet comme paramètre communiquent avec la version spécifiée lors de la configuration du service. En l'absence de tout versioning, la dernière version est activée sur le serveur.
Objets marshalés par valeur
Lorsqu'un objet marshalé par valeur (MBV, Marshaled-By-Value) est passé entre des domaines d'application, le formateur utilisé détermine si des informations de version sont incluses. Les objets BinaryFormatter incluent toujours la version, tandis que l'objet SoapFormatter ignore 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, SoapFormatter ajoute les informations de versioning lorsqu'il sérialise un objet.
<formatter ref="soap" includeVersions="true" />
Voir aussi
Concepts
Configuration d'applications distantes
Activation par client
Activation par serveur