Freigeben über


Aufwärtskompatible Datenverträge

Ein Merkmal des Windows Communication Foundation (WCF)-Datenvertragssystems ist, dass sich Verträge im Laufe der Zeit ohne Unterbrechung weiterentwickeln 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 Empfohlene Vorgehensweisen: Versionsverwaltung von Datenverträgen.

Sie können beim Erstellen neuer Versionen eines bestehenden Datenvertrags die meisten Versionsverwaltungsfunktionen nach Bedarf verwenden. Eine Versionsverwaltungsfunktion, der Roundtrip, 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 fullName As String
End Class 
[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}

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
    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 
[DataContract]
public class Person : IExtensibleDataObject
{
    [DataMember]
    public string fullName;
    private ExtensionDataObject theData;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return theData; }
        set { theData = value; }
    }
}

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 DataContractSerializer-Konstruktor auf true fest, oder legen Sie die IgnoreExtensionDataObject-Eigenschaft im ServiceBehaviorAttribute auf true 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.

Siehe auch

Verweis

IExtensibleDataObject
ExtensionDataObject

Konzepte

Datenvertragsversionsverwaltung
Empfohlene Vorgehensweisen: Versionsverwaltung von Datenverträgen