Freigeben über


Forward-Compatible Datenverträge

Ein Merkmal des Windows Communication Foundation (WCF)-Datenvertragssystems besteht darin, dass Verträge im Laufe der Zeit auf nicht störende Weise weiterentwickelt werden können. Das heißt, ein Kunde mit einer älteren Version eines Datenvertrags kann mit einem Dienst mit einer neueren Version desselben Datenvertrags kommunizieren, oder ein Kunde mit einer neueren Version eines Datenvertrags kann mit einer älteren Version desselben Datenvertrags kommunizieren. Weitere Informationen finden Sie unter Best Practices: Datenvertragsversionsverwaltung.

Sie können die meisten Versionsverwaltungsfeatures nach Bedarf anwenden, wenn neue Versionen eines vorhandenen Datenvertrags erstellt werden. Jedoch muss eine Versionsfunktion, Roundtripping, bereits von der ersten Version an in den Typ integriert werden, um ordnungsgemäß zu funktionieren.

Roundtrip-Funktion

Roundtripping tritt auf, wenn Daten von einer neuen Version an eine alte Version und zurück zur neuen Version eines Datenvertrags übergeben werden. Roundtripping garantiert, dass keine Daten verloren gegangen sind. 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 Roundtripping für einen bestimmten Typ zu aktivieren, muss der Typ die IExtensibleDataObject Schnittstelle implementieren. Die Schnittstelle enthält eine Eigenschaft ExtensionData (gibt den ExtensionDataObject Typ zurück). Die Eigenschaft speichert beliebige Daten aus zukünftigen Versionen des Datenvertrags, die unbekannt für die aktuelle Version sind.

Beispiel

Der folgende Datenvertrag ist nicht mit zukünftigen Änderungen kompatibel.

[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}
<DataContract()> _
Public Class Person
    <DataMember()> _
    Public fullName As String
End Class

Um den Typ mit zukünftigen Änderungen kompatibel zu machen (z. B. hinzufügen eines neuen Datenmemms namens "phoneNumber"), implementieren Sie die IExtensibleDataObject Schnittstelle.

[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. Es wird nicht auf andere Weise verarbeitet, mit Ausnahme des temporären Speichers. Wenn das Objekt an den Ursprungsort zurückgesendet wird, werden auch die ursprünglichen (unbekannten) Daten zurückgegeben. Daher haben die Daten einen Roundtrip zum und vom ursprünglichen Endpunkt ohne Verlust vorgenommen. Beachten Sie jedoch, dass, wenn der ursprüngliche Endpunkt die zu verarbeitenden Daten benötigt hat, diese Erwartung nicht erfüllt ist, und der Endpunkt muss die Änderung irgendwie erkennen und berücksichtigen.

Der ExtensionDataObject Typ enthält keine öffentlichen Methoden oder Eigenschaften. Daher ist es unmöglich, direkten Zugriff auf die in der ExtensionData Eigenschaft gespeicherten Daten zu erhalten.

Das Roundtripping-Feature kann deaktiviert werden, entweder indem ignoreExtensionDataObject auf true im DataContractSerializer-Konstruktor gesetzt wird oder indem die IgnoreExtensionDataObject-Eigenschaft auf true im ServiceBehaviorAttribute gesetzt wird. Wenn dieses Feature deaktiviert ist, füllt der Deserializer die ExtensionData Eigenschaft nicht auf, und der Serialisierer gibt den Inhalt der Eigenschaft nicht aus.

Siehe auch