Información de versión en interacción remota
La interacción remota se diseñó para funcionar con ensamblados de nombre seguro. Cuando se utilizan nombres seguros con la interacción remota, se aplican las reglas básicas siguientes:
Siempre se incluyen versiones en la propiedad TypeName de una implementación de interfaz IMethodCallMessage.
Las versiones siempre se incluyen en la propiedad ActivationTypeName de una implementación de interfaz IConstructionCallMessage.
Las versiones siempre se incluyen en la propiedad TypeInfo almacenada en los objetos ObjRef.
El resto de la información sobre la versión en la interacción remota se determina mediante la propiedad includeVersions del formateador que se usa. De manera predeterminada, el objeto BinaryFormatter genera información sobre la versión, pero el objeto SoapFormatter no lo hace. Esta propiedad se puede cambiar mediante programación cuando se crea un canal o se puede configurar mediante el archivo de configuración de interacción remota.
En esta sección se describe la forma en que estas reglas afectan a las referencias a objetos y a los diferentes modelos de activación que se utilizan normalmente en la interacción remota.
Objetos activados en el servidor
El servidor controla qué versión de un tipo se activa cuando un cliente se conecta con un objeto activado en el servidor (o <wellknown>). Si no se especifica ningún tipo de información sobre la versión en el momento de configurar el servicio, cuando se activa el objeto se usa la versión más reciente del ensamblado. Por ejemplo, si tiene dos ensamblados, MyHello versión 1.0.0.0 y MyHello versión 2.0.0.0, el objeto conocido se activa utilizando el ensamblado correspondiente a la versión 2 si no hay ninguna información sobre la versión. Es importante resaltar que esta versión se utiliza independientemente de la versión a la que se hizo referencia cuando se creó el cliente.
El servicio se puede configurar de manera que utilice una versión específica de un ensamblado. Por ejemplo, en el siguiente archivo de configuración se muestra cómo especificar una versión. Tenga en cuenta que si un ensamblado está en la caché de ensamblados global, debe especificar toda la información de tipos, incluida la información de referencia cultural y la clave pública. En los siguientes ejemplos de configuración se omite la información sobre los nombres seguros para concentrarse en las versiones.
<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>
En este archivo se especifica que debe utilizarse la versión 1.0.0.0 del ensamblado MyHello
para crear objetos para sus clientes. Cuando se especifica más de una versión de un mismo objeto en el extremo, la última especificada es la que se utiliza cuando se activa el objeto. Es primordial recordar que cualquier cambio significativo entre una versión y otra del mismo objeto puede tener un efecto adverso en los clientes. Si se agrega o se modifica un parámetro de un método de una versión a otra, los clientes compilados con la versión 1 iniciarán una excepción cuando se usen con la versión 2. Por lo tanto, se recomienda alojar una versión nueva de un objeto en un extremo diferente cuando se hayan introducido cambios significativos en la versión más reciente.
Objetos activados en el cliente
Cuando un cliente activa un objeto activado en el cliente (es decir, un <activated>), se envía inmediatamente una llamada de red al servidor donde se activa el objeto solicitado y se devuelve una referencia a ese objeto al cliente. Dado que dirige la activación del objeto, el cliente también elige la versión del objeto que se va a activar. Por ejemplo, la versión 1 de HelloService se activará en el servidor si se creó el cliente con la versión 1 del objeto y la versión 2 de HelloService se activará en el servidor si se creó el cliente con la versión 2.
Es importante tener en cuenta que no puede especificar el número de la versión para tipos activados en el cliente en el momento de configurar el servicio. Además, la información sobre la versión proporcionada para los tipos activados en el servidor no tiene efecto en los objetos activados en el cliente, aunque ambos tipos estén en el mismo ensamblado.
Por ejemplo, imagine que tiene un tipo activado en el cliente y un tipo activado en el servidor en el mismo ensamblado, y crea el cliente 1 con la versión 1 y el cliente 2 con la versión 2. Si no se especifica ninguna información sobre la versión para el objeto activado en el servidor, el cliente 1 recibirá la versión 2 del objeto activado en el servidor y la versión 1 del objeto activado en el cliente. El cliente 2 recibirá objetos de la versión 2 tanto para tipos conocidos como para tipos activados.
Si configura el servicio de manera que utilice la versión 1 del ensamblado para objetos conocidos, ambos clientes recibirán la versión 1 del objeto conocido, mientras que el cliente 1 recibirá la versión 1 del tipo activado y el cliente 2 recibirá la versión 2 del tipo activado.
La versión activada para el cliente no se puede configurar: siempre se utiliza la versión con la que se creó el cliente.
Referencias a objetos
Las mismas reglas que se aplican a los tipos activados en el servidor y a los tipos activados en el cliente se aplican también a las referencias a objetos. Por ejemplo, cuando se pasa un proxy para un tipo activado en el cliente como parámetro desde un cliente a otro, o desde un cliente al servidor, se pasa también la información de la versión incrustada en la referencia al objeto. Cuando el receptor intenta llamar a un método en el proxy generado desde la referencia al objeto, la versión incrustada en la referencia al objeto tiene preferencia sobre la versión con la que se creó el cliente. En el caso de objetos activados en el servidor, éste determina la versión que se utilizará y todos los clientes que reciban una referencia a un objeto como parámetro se comunican con la versión especificada cuando se configuró el servicio. Si no hay información sobre la versión, se activa la última en el servidor.
Objetos de cálculo de referencias por valor
Cuando se pasa un objeto MBV (Marshal-By-Value, cálculo de referencias por valor) de un dominio de aplicación a otro, el formateador utilizado determina si se incluye la información de la versión. Los objetos BinaryFormatter siempre incluyen la versión, mientras que el objeto SoapFormatter la omite. Esta opción se puede habilitar y deshabilitar para ambos formateadores. Por ejemplo, si se agrega la línea siguiente al archivo de configuración, el SoapFormatter agrega la información de la versión cuando serializa un objeto.
<formatter ref="soap" includeVersions="true" />
Vea también
Conceptos
Configuración de aplicaciones remotas
Activación del cliente
Activación del servidor