Share via


Información de versión en comunicación remota

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

La comunicación remota se diseñó para trabajar con ensamblados de nombre seguro. Cuando los nombres seguros se utilizan con comunicación remota, se aplican siguientes reglas básicas:

  • Las versiones siempre están incluidas con la propiedad TypeName de una implementación de interfaces de IMethodCallMessage.

  • Las versiones siempre están incluidas con la propiedad ActivationTypeName de una implementación de interfaces de IConstructionCallMessage.

  • Las versiones siempre están incluidas con la propiedad TypeInfo almacenada en objetos ObjRef.

  • La propiedad includeVersions del formateador en uso determina el resto de versiones en comunicación remota. De forma predeterminada, el objeto BinaryFormatter genera información de 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 establecer a través del archivo de configuración remota.

En esta sección se describe cómo estas reglas afectan a las referencias de objeto y a los diferentes modelos de activación utilizados normalmente en comunicación remota.

Objetos activados en el servidor

El servidor controla qué versión de un tipo se activa cuando un cliente se conecta a un objeto activado en el servidor (o <wellknown>). Si no se proporciona información sobre la versión cuando se configura el servicio, se utiliza la versión más reciente del ensamblado cuando se activa el objeto. Por ejemplo, si tiene dos ensamblados, versión MyHello 1.0.0.0 y versión MyHello 2.0.0.0, el objeto conocido se activa utilizando la versión 2.0 del ensamblado si no se proporciona información sobre la versión. Es importante tener en cuenta que esta versión se utiliza sin tener en cuenta la versión a la que se hizo referencia cuando se generó el cliente.

El servicio se puede configurar para utilizar una versión concreta de un ensamblado. Por ejemplo, el siguiente archivo de configuración muestra cómo especificar una versión. Tenga en cuenta que si un ensamblado está en la caché global de ensamblados, usted debe especificar toda la información de tipo, incluyendo la información de referencia cultural y la clave pública. Los siguientes ejemplos de configuración omiten la información del nombre seguro para concentrarse en la versión.

<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>

Este archivo especifica que la versión 1.0.0.0 del ensamblado MyHello se debería utilizar con el fin de crear objetos para sus clientes. Cuando en el extremo se especifica más de una versión del mismo objeto, al activar el objeto se utiliza la última versión especificada. Es importante recordar que cualquier cambio significativo en las versiones del mismo objeto pueda tener un efecto no deseado en los clientes. Si un parámetro de método se agrega o modifica entre las versiones, los clientes compilados con la versión 1.0 producen una excepción cuando se utilizó la versión 2.0. Por consiguiente, se recomienda que una nueva versión de un objeto se hospede en un extremo diferente cuando se produzca cualquier cambio significativo entre las versiones.

Objetos activados en el cliente

Cuando un cliente activa un objeto activado en el cliente (es decir, un <activated>), se envía una llamada de la red al servidor, donde se activa el objeto solicitado y al cliente se le devuelve una referencia de objeto al objeto. Dado que ésta 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.0 de HelloService se activa en el servidor si el cliente estuviera generado para la versión 1.0 del objeto, y la versión 2.0 de HelloService se activa en el servidor si el cliente se generó para la versión 2.0.

Es importante tener en cuenta que no puede especificar el número de versión para los tipos activados en el cliente al configurar el servicio. Asimismo, cualquier información de versión proporcionada para los tipos activados en el servidor no tiene ningún efecto en objetos activados en el cliente, incluso si ambos tipos están en el mismo ensamblado.

Por ejemplo, un tipo activado por el cliente y un tipo activado por el servidor están en el mismo ensamblado y genera client1 contra la versión 1.0 y client2 contra la versión 2.0. Si no se especifica ninguna información de versión para el objeto activado en el servidor, client1 recibe la versión 2.0 del objeto activado por el servidor y la versión 1.0 del objeto activado por el cliente. El cliente2 recibe la versión 2.0 del objeto para ambos tipos: el conocido y el activado.

Si configura el servicio para utilizar la versión 1.0 del ensamblado para el objeto conocido, ambos clientes reciben la versión 1.0 del objeto conocido mientras que el cliente1 recibe la versión 1.0 del tipo activado y el cliente2 recibe la versión 2.0 del tipo activado.

No se puede configurar la versión activada para un cliente; se utiliza siempre la versión con la que se generó el cliente.

Referencias a objetos

Las mismas reglas que se aplican a los tipos activados en el servidor y a lo activados en el cliente también se aplican a las referencias a objetos. Por ejemplo, cuando un proxy para un tipo activado en el cliente se pasa como un parámetro de un cliente a otro o de un cliente al servidor, la información de versión incrustada en la referencia al objeto se pasa con él. Cuando el receptor intenta llamar a un método en el proxy generado a partir de la referencia al objeto, la versión incrustada en la referencia al objeto tiene precedencia sobre la versión para la que se generó el cliente. En el caso de los objetos activados en el servidor, el servidor dicta la versión que se utiliza y todos los clientes que reciben una referencia al objeto como un parámetro se comunican con la versión que se especificó al configurar el servicio. Si no existe ninguna versión, en el servidor se activa la última versión.

Objetos de cálculo de referencia por valor

Cuando se pasa un objeto de cálculo de referencia por valor (MBV) entre los dominios de aplicación, el formateador utilizado determina si se ha incluido la información relativa a la versión. Los objetos BinaryFormatter siempre incluyen la versión, mientras que los objetos SoapFormatter siempre omiten la información acerca de la versión. Esta opción puede estar habilitada o deshabilitada para ambos formateadores. Por ejemplo, si se agrega la línea siguiente al archivo de configuración, el SoapFormatter agrega información de versión cuando serializa un objeto.

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

Vea también

Conceptos

Configuración de aplicaciones remotas
Activación de cliente
Activación del servidor

Otros recursos

Información general de servicios remotos de .NET Framework