Dela via


Framåtkompatibla datakontrakt

En funktion i WCF-datakontraktssystemet (Windows Communication Foundation) är att kontrakt kan utvecklas över tid på icke-banbrytande sätt. En klient med en äldre version av ett datakontrakt kan alltså kommunicera med en tjänst med en nyare version av samma datakontrakt, eller så kan en klient med en nyare version av ett datakontrakt kommunicera med en äldre version av samma datakontrakt. Mer information finns i Metodtips: Versionshantering av datakontrakt.

Du kan tillämpa de flesta versionsfunktioner efter behov när nya versioner av ett befintligt datakontrakt skapas. Men en versionsfunktion, rund-tripping, måste vara inbyggd i typen från den första versionen för att fungera korrekt.

Rund-tripping

Avrundning sker när data skickas från en ny version till en gammal version och tillbaka till den nya versionen av ett datakontrakt. Rund-tripping garanterar att inga data går förlorade. Om du aktiverar round-tripping blir typen framåtkompatibel med eventuella framtida ändringar som stöds av versionsmodellen för datakontrakt.

För att aktivera rund-tripping för en viss typ måste typen implementera IExtensibleDataObject gränssnittet. Gränssnittet innehåller en egenskap ( ExtensionData returnerar ExtensionDataObject typen). Egenskapen lagrar alla data från framtida versioner av datakontraktet som är okända för den aktuella versionen.

Exempel

Följande datakontrakt är inte framåtkompatibelt med framtida ändringar.

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

Om du vill göra typen kompatibel med framtida ändringar (till exempel att lägga till en ny datamedlem med namnet "phoneNumber" implementerar du IExtensibleDataObject gränssnittet.

[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

När WCF-infrastrukturen påträffar data som inte ingår i det ursprungliga datakontraktet lagras data i egenskapen och bevaras. Det bearbetas inte på något annat sätt förutom för tillfällig lagring. Om objektet returneras tillbaka till platsen där det kom ifrån returneras även ursprungliga (okända) data. Därför har datan gjort en tur och retur till och från den ursprungliga slutpunkten utan förlust. Observera dock att om den ursprungliga slutpunkten krävde att data bearbetas är förväntningarna ouppfyllda och slutpunkten måste på något sätt identifiera och hantera ändringen.

Typen ExtensionDataObject innehåller inga offentliga metoder eller egenskaper. Därför är det omöjligt att få direkt åtkomst till data som lagras i ExtensionData egenskapen.

Funktionen för avrundning kan inaktiveras, antingen genom att ställa in ignoreExtensionDataObjecttrue i DataContractSerializer konstruktorn eller genom att true ställa in IgnoreExtensionDataObject egenskapen på på ServiceBehaviorAttribute. När den här funktionen är inaktiverad fyller inte deserialiseraren ExtensionData egenskapen och serialiseraren genererar inte innehållet i egenskapen.

Se även