Aufwärtskompatible Datenverträge
Ein Feature des Windows Communication Foundation (WCF)-Datenvertragssystems besteht darin, dass Verträge im Laufe der Zeit auf geschützte Weise weiterentwickelt werden können. Dies bedeutet, dass ein Client mit einer älteren Version eines Datenvertrags mit einem Dienst, der eine neuere Version dieses Datenvertrags aufweist, kommunizieren kann bzw. dass ein Client mit einer neueren Version eines Datenvertrags mit einer älteren Version dieses Datenvertrags kommunizieren kann. Weitere Informationen finden Sie unter Best Practices: Datenvertragsversionsverwaltung.
Sie können beim Erstellen neuer Versionen eines bestehenden Datenvertrags die meisten Versionsverwaltungsfunktionen nach Bedarf verwenden. Eine Versionsverwaltungsfunktion, der round-tripping, muss jedoch von Anfang an in den Typ integriert werden, damit sie richtig funktioniert.
Roundtrip-Funktion
Ein Roundtrip findet statt, wenn Daten von einer neuen Version an eine alte Version und wieder zurück an die neue Version eines Datenvertrags übergeben werden. Durch den Roundtrip wird sichergestellt, dass keine Daten verloren gehen. Durch die aktivierte Roundtrip-Funktion wird der Typ aufwärtskompatibel, das heißt, dass alle zukünftigen Änderungen vom Versionsverwaltungsmodell des Datenvertrags unterstützt werden.
Um die Roundtrip-Funktion für einen bestimmten Typ zu aktivieren, muss der Typ die IExtensibleDataObject-Schnittstelle implementieren. Die Schnittstelle enthält die ExtensionData-Eigenschaft (und gibt den ExtensionDataObject-Typ zurück). In der Eigenschaft werden alle Daten aus zukünftigen Versionen des Datenvertrags, die in der aktuellen Version unbekannt sind, gespeichert.
Beispiel
Der folgende Datenvertrag ist nicht mit zukünftigen Änderungen aufwärtskompatibel:
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
Damit der Typ mit zukünftigen Änderungen (wie zum Beispiel einem hinzugefügten Datenmember "phoneNumber") kompatibel wird, muss die IExtensibleDataObject-Schnittstelle implementiert werden.
[DataContract]
public class Person : IExtensibleDataObject
{
[DataMember]
public string fullName;
private ExtensionDataObject theData;
public virtual ExtensionDataObject ExtensionData
{
get { return theData; }
set { theData = value; }
}
}
<DataContract()> _
Public Class Person
Implements IExtensibleDataObject
<DataMember()> _
Public fullName As String
Private theData As ExtensionDataObject
Public Overridable Property ExtensionData() As _
ExtensionDataObject Implements _
IExtensibleDataObject.ExtensionData
Get
Return theData
End Get
Set
theData = value
End Set
End Property
End Class
Wenn die WCF-Infrastruktur auf Daten trifft, die nicht zum ursprünglichen Datenvertrag gehören, werden die Daten in der Eigenschaft gespeichert und so aufbewahrt. Eine Verarbeitung erfolgt nur für die vorübergehende Speicherung. Wird das Objekt an seinen Ursprungsort zurückgegeben, werden die ursprünglichen (unbekannten) Daten ebenfalls zurückgegeben. Auf diese Weise durchlaufen die Daten ohne Verlust einen Roundtrip zum und vom ursprünglichen Endpunkt. Beachten Sie jedoch, dass der Endpunkt die Änderungen selbst erkennen und umsetzen muss, falls der ursprüngliche Endpunkt eine Verarbeitung der Daten erfordert und diese Voraussetzung nicht erfüllt werden kann.
Der ExtensionDataObject-Typ enthält keine öffentlichen Methoden oder Eigenschaften. Daher kann nicht direkt auf die in der ExtensionData-Eigenschaft gespeicherten Daten zugegriffen werden.
Sie können die Roundtrip-Funktion deaktivieren. Legen Sie hierfür entweder ignoreExtensionDataObject
im true
-Konstruktor auf DataContractSerializer fest, oder legen Sie die IgnoreExtensionDataObject-Eigenschaft im true
auf ServiceBehaviorAttribute fest. Wenn diese Funktion deaktiviert ist, wird die ExtensionData-Eigenschaft nicht vom Deserialisierungsprogramm gefüllt, und der Inhalt der Eigenschaft wird nicht vom Serialisierungsprogramm ausgegeben.