Informazioni sulla versione in .NET Remoting

.NET Remoting è stato progettato per lavorare con assembly con nome sicuro. Quando i nomi sicuri sono utilizzati con .NET Remoting, si applicano le seguenti regole di base:

  • Le versioni sono incluse sempre con la proprietà TypeName di un'implementazione dell'interfaccia di IMethodCallMessage.

  • Le versioni sono incluse sempre con la proprietà ActivationTypeName di un'implementazione dell'interfaccia IConstructionCallMessage.

  • Le versioni sono incluse sempre con la proprietà TypeInfo archiviata negli oggetti ObjRef.

  • Tutti gli altri controlli di versione in .NET Remoting vengono determinati dalla proprietà includeVersions del formattatore utilizzato. Per impostazione predefinita, l'oggetto BinaryFormatter genera informazioni di controllo delle versioni ma l'oggetto SoapFormatter non lo fa. Questa proprietà può essere modificata a livello di codice quando un canale viene creato o può essere impostata tramite il file di configurazione .NET Remoting.

In questa sezione viene descritto come queste regole influiscono su riferimenti all'oggetto e sui diversi modelli di attivazione utilizzati comunemente in .NET Remoting.

Oggetti attivati dal server

Il server controlla quale versione di un tipo viene attivata quando un client si connette a un oggetto attivato dal server (o <wellknown>). Se non vengono fornite informazioni sulla versione durante la configurazione del servizio, viene utilizzata la versione più recente dell'assembly quando l'oggetto viene attivato. Ad esempio, se si hanno due assembly, MyHello versione 1.0.0.0 e MyHello versione 2.0.0.0, l'oggetto noto viene attivato utilizzando la versione 2.0 dell'assembly se non sono state fornite informazioni sulla versione. È importante notare che questa versione viene utilizzata indipendentemente dalla versione a cui viene fatto riferimento in fase di creazione del client.

Il servizio può essere configurato per utilizzare una versione specifica di un assembly. Nel file di configurazione seguente, per esempio, viene illustrato come specificare una versione. Si noti che se un assembly si trova nella cache di assembly globale sarà necessario specificare tutte le informazioni sui tipi, incluse le impostazioni cultura e la chiave pubblica. Negli esempi di configurazione seguenti vengono omesse le informazioni sul nome sicuro per concentrarsi sul controllo di versione.

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

Questo file specifica che dev'essere utilizzata la versione 1.0.0.0 dell'assembly MyHello per creare oggetti per i client. Quando all'endpoint viene specificata più di una versione dello stesso oggetto, sarà l'ultima versione specificata a essere utilizzata quando l'oggetto viene attivato. È importante ricordare che qualsiasi modifica significativa tra versioni dello stesso oggetto può avere un effetto negativo sui client. Se un parametro del metodo viene aggiunto o modificato tra versioni diverse, i client compilati rispetto alla versione 1.0 generano un'eccezione quando vengono utilizzati nella versione 2.0. Pertanto, in caso di modifiche significative fra diverse versioni, è consigliato ospitare una versione nuova di un oggetto su un altro endpoint.

Oggetti attivati dal client

Quando un client attiva un oggetto attivato dal client (ovvero, un <activated>), viene inviata una chiamata di rete al server dove l'oggetto richiesto viene attivato e viene restituito al client un riferimento all'oggetto. Dal momento che dirige l'attivazione dell'oggetto, il client sceglie anche la versione dell'oggetto da attivare. Ad esempio, la versione 1.0 di HelloService viene attivata sul server se il client è stato creato con la versione 1.0 dell'oggetto, e la versione 2.0 di HelloService viene attivata sul server se il client è stato creato con la versione 2.0.

È importante notare che non è possibile specificare il numero di versione per i tipi attivati dal client durante la configurazione del servizio. Qualsiasi informazione di controllo versione fornita per i tipi attivati dal server, inoltre, non ha effetto sugli oggetti attivati dal client, anche se entrambi i tipi sono nello stesso assembly.

Per esempio, un tipo attivato dal client e un tipo attivato dal server sono nello stesso assembly e si crea client1 usando la versione 1.0 e client2 usando la versione 2.0. Se non vengono specificate informazioni di versione per l'oggetto attivato dal server, client1 riceve la versione 2.0 dell'oggetto attivato dal server e la versione 1.0 dell'oggetto attivato dal client. Client2 riceve gli oggetti della versione 2.0 per tipi conosciuti e attivati.

Se si configura il servizio per utilizzare la versione 1.0 dell'assembly per l'oggetto noto, entrambi i client ricevono la versione 1.0 dell'oggetto noto mentre client1 riceve la versione 1.0 del tipo attivato e client 2 riceve la versione 2.0 del tipo attivato.

Non è possibile configurare la versione attivata per un client; viene sempre utilizzata la versione su cui è stato creato il client.

Riferimenti a oggetti

Le stesse regole che si applicano ai tipi attivati dal server e attivati dal client si applicano ai riferimenti all'oggetto. Ad esempio, quando un proxy per un tipo attivato dal client viene passato come parametro da un client a un altro o da un client al server, le informazioni di versione incorporate nel riferimento all'oggetto vengono passate con lui. Quando il ricevitore tenta di chiamare un metodo sul proxy generato dal riferimento all'oggetto, la versione incorporata nel riferimento all'oggetto ha la precedenza sulla versione con cui il client è stato creato. Nel caso di oggetti attivati dal server, il server definisce la versione utilizzata e tutti i client che ricevono un riferimento all'oggetto come parametro comunicano con la versione specificata quando il servizio è stato configurato. In assenza di qualsiasi controllo di versione, verrà attivata sul server la versione più recente.

Oggetti marshalling per valore

Quando un oggetto marshalling per valore (MBV) viene passato tra domini applicazione, il formattatore utilizzato determina se le informazioni sulla versione vengono incluse o meno. Gli oggetti BinaryFormatter includono sempre il numero di versione, mentre gli oggetti SoapFormatter ignorano le informazioni di versione. Questa opzione può essere attivata o disattivata per entrambi i formattatori. Ad esempio, se viene aggiunta al file di configurazione la riga seguente, SoapFormatter aggiunge informazioni di controllo di versione durante la serializzazione di un oggetto.

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

Vedere anche

Concetti

Configurazione di applicazioni remote
Attivazione da client
Attivazione del server

Altre risorse

Panoramica di .NET Framework Remoting

Footer image

Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.