Versionsinformationen in Remoting
Remoting wurde für die Arbeit mit Assemblys mit starkem Namen entworfen. Wenn starke Namen in Verbindung mit Remoting verwendet werden, gelten die folgenden Basisregeln:
Versionen werden immer mit der TypeName-Eigenschaft einer IMethodCallMessage-Schnittstellenimplementierung eingeschlossen.
Versionen werden immer mit der ActivationTypeName-Eigenschaft einer IConstructionCallMessage-Schnittstellenimplementierung eingeschlossen.
Versionen werden immer mit der in ObjRef-Objekten gespeicherten TypeInfo-Eigenschaft eingeschlossen.
Die restliche Versionsverwaltung in Remoting wird durch die includeVersions-Eigenschaft des verwendeten Formatierungsprogramms bestimmt. Standardmäßig generiert das BinaryFormatter-Objekt Versionsinformationen, das SoapFormatter-Objekt jedoch nicht. Diese Eigenschaft kann beim Erstellen eines Channels programmgesteuert geändert oder über die Remotekonfigurationsdatei festgelegt werden.
In diesem Abschnitt wird beschrieben, wie sich diese Regeln auf die Objektverweise und die verschiedenen Aktivierungsmodelle auswirken, die beim Remoting häufig verwendet werden.
Vom Server aktivierte Objekte
Der Server steuert, welche Version eines Typs aktiviert wird, wenn ein Client eine Verbindung mit einem vom Server aktivierten Objekt (oder <wellknown>-Objekt) herstellt. Wenn bei der Konfiguration des Dienstes keine Versionsinformationen bereitgestellt werden, wird beim Aktivieren des Objekts die neueste Version verwendet. Wenn Sie z. B. über zwei Assemblys, MyHello
, Version 1.0.0.0, und MyHello
, Version 2.0.0.0, verfügen, wird das bekannte Objekt mit Version 2.0 der Assembly aktiviert, falls keine Versionsinformationen bereitgestellt werden. Beachten Sie unbedingt, dass diese Version unabhängig von der Version verwendet wird, auf die bei der Clienterstellung verwiesen wurde.
Der Dienst kann so konfiguriert werden, dass er eine bestimmte Version einer Assembly verwendet. Die folgende Konfigurationsdatei veranschaulicht z. B. die Angabe einer Version. Wenn sich eine Assembly im globalen Assemblycache befindet, müssen alle Typinformationen, einschließlich Kulturinformationen und öffentlicher Schlüssel, angegeben werden. In den folgenden Konfigurationsbeispielen werden die Informationen zu starken Namen weggelassen, damit Sie sich auf die Versionsverwaltung konzentrieren können.
<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>
Diese Datei gibt an, dass Version 1.0.0.0 der MyHello
-Assembly verwendet werden soll, um Objekte für ihre Clients zu erstellen. Wenn am Endpunkt mehrere Versionen eines Objekts angegeben sind, wird beim Aktivieren des Objekts die zuletzt angegeben Version verwendet. Beachten Sie unbedingt, dass wichtige Änderungen zwischen den Versionen eines Objekts negative Auswirkungen auf Clients haben können. Wenn ein Methodenparameter zwischen den Versionen hinzugefügt oder geändert wird, lösen für Version 1.0 kompilierte Clients eine Ausnahme aus, wenn sie für Version 2.0 verwendet werden. Wenn zwischen den Versionen wichtige Änderungen vorgenommen wurden, empfiehlt es sich daher, die neue Version eines Objekts an einem anderen Endpunkt zu hosten.
Vom Client aktivierte Objekte
Wenn ein Client ein vom Client aktiviertes Objekt (d. h. ein <activated>-Objekt) aktiviert, wird ein Netzwerkaufruf an den Server gesendet. Dort wird das angeforderte Objekt aktiviert, und ein Objektverweis auf das Objekt wird an den Client zurückgegeben. Weil der Client die Aktivierung des Objekts anweist, wählt er auch die Version des zu aktivierenden Objekts. So wird z. B. HelloService
, Version 1.0, auf dem Server aktiviert, wenn der Client für Version 1.0 des Objekts erstellt wurde, und HelloService
, Version 2.0, wird auf dem Server aktiviert, wenn der Client für Version 2.0 erstellt wurde.
Beachten Sie unbedingt, dass Sie die Versionsnummer für von Clients aktivierte Typen nicht angeben können, wenn Sie den Dienst konfigurieren. Außerdem haben Versionsinformationen, die für vom Servern aktivierte Typen bereitgestellt wurden, keine Auswirkungen auf vom Client aktivierte Objekte, selbst wenn sich beide Typen in derselben Assembly befinden.
Angenommen, ein vom Client aktivierter Typ und ein vom Server aktivierter Typ sind in derselben Assembly enthalten und Sie erstellen client1 für Version 1.0 und client2 für Version 2.0. Wenn für das vom Server aktivierte Objekt keine Versionsinformationen angegeben wurden, empfängt client1 Version 2.0 des vom Server aktivierten Objekts und Version 1.0 des vom Client aktivierten Objekts. Client2 empfängt sowohl für bekannte als auch für aktivierte Typen Objekte der Version 2.0.
Wenn Sie den Dienst so konfigurieren, dass Version 1.0 der Assembly für das bekannte Objekt verwendet wird, empfangen beide Clients Version 1.0 des bekannten Objekts, während client1 Version 1.0 des aktivierten Typs und client2 Version 2.0 des aktivierten Typs empfängt.
Die für einen Client aktivierte Version kann nicht konfiguriert werden. Es wird immer die Version verwendet, für die der Client erstellt wurde.
Objektverweise
Die Regeln, die für vom Server aktivierte und vom Client aktivierte Typen gelten, gelten auch für Objektverweise. Wenn beispielsweise ein Proxy für einen vom Client aktivierten Typ als Parameter von einem Client an einen anderen Client oder von einem Client an den Server übergeben wird, werden die in den Objektverweis eingebetteten Versionsinformationen mit übergeben. Wenn der Empfänger versucht, eine Methode für den aus dem Objektverweis generierten Proxy aufzurufen, hat die in den Objektverweis eingebettete Version Vorrang vor der Version, für die der Client erstellt wurde. Bei vom Server aktivierten Objekten gibt der Server die verwendete Version vor. Alle Clients, die einen Objektverweis als Parameter empfangen, kommunizieren mit der Version, die bei der Konfiguration des Servers angegeben wurde. Wenn keine Versionsinformationen vorhanden sind, wird die neueste Version auf dem Server aktiviert.
Als Wert gemarshallte Objekte
Wenn ein als Wert gemarshalltes Objekt (Marshal-By-Value-Objekt, MBV-Objekt) zwischen Anwendungsdomänen übergeben wird, bestimmt das verwendete Formatierungsprogramm, ob Versionsinformationen eingeschlossen werden. BinaryFormatter-Objekte schließen die Version immer ein, während SoapFormatter-Objekte Versionsinformationen ignorieren. Diese Option kann für beide Formatierungsprogramme aktiviert oder deaktiviert werden. Wenn der Konfigurationsdatei zum Beispiel die folgende Zeile hinzugefügt wird, fügt SoapFormatter beim Serialisieren eines Objekts Versionsinformationen hinzu.
<formatter ref="soap" includeVersions="true" />
Siehe auch
Konzepte
Konfiguration von Remoteanwendungen
Clientaktivierung
Serveraktivierung
Weitere Ressourcen
.Übersicht über .NET Framework-Remoting
Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.