Delen via


Doorsturen compatibele gegevenscontracten

Een functie van het WCF-gegevenscontractsysteem (Windows Communication Foundation) is dat contracten in de loop van de tijd op niet-brekende manieren kunnen evolueren. Dat wil zeggen dat een client met een oudere versie van een gegevenscontract kan communiceren met een service met een nieuwere versie van hetzelfde gegevenscontract, of een client met een nieuwere versie van een gegevenscontract kan communiceren met een oudere versie van hetzelfde gegevenscontract. Zie Best Practices: Versiebeheer van gegevenscontract voor meer informatie.

U kunt de meeste versiefuncties zo nodig toepassen wanneer er nieuwe versies van een bestaand gegevenscontract worden gemaakt. Eén versiefunctie, retourneert echter, moet worden ingebouwd in het type van de eerste versie om goed te kunnen werken.

Round-Tripping

Retourneert gegevens van een nieuwe versie naar een oude versie en terug naar de nieuwe versie van een gegevenscontract. Retourrondje garandeert dat er geen gegevens verloren gaan. Als u roundtripping inschakelt, wordt het type doorsturen compatibel met toekomstige wijzigingen die worden ondersteund door het versiebeheermodel van het gegevenscontract.

Als u roundtripping voor een bepaald type wilt inschakelen, moet het type de IExtensibleDataObject interface implementeren. De interface bevat één eigenschap ( ExtensionData retourneert het ExtensionDataObject type). In de eigenschap worden gegevens uit toekomstige versies van het gegevenscontract opgeslagen die niet bekend zijn bij de huidige versie.

Opmerking

Het volgende gegevenscontract is niet compatibel met toekomstige wijzigingen.

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

Implementeer de interface om het type compatibel te maken met toekomstige wijzigingen (zoals het toevoegen van een nieuw gegevenslid met de IExtensibleDataObject naam phoneNumber).

[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

Wanneer de WCF-infrastructuur gegevens tegenkomt die geen deel uitmaken van het oorspronkelijke gegevenscontract, worden de gegevens opgeslagen in de eigenschap en bewaard. Het wordt niet op een andere manier verwerkt, met uitzondering van tijdelijke opslag. Als het object wordt geretourneerd naar waar het vandaan komt, worden ook de oorspronkelijke (onbekende) gegevens geretourneerd. Daarom hebben de gegevens een retour naar en van het oorspronkelijke eindpunt gemaakt zonder verlies. Houd er echter rekening mee dat als het oorspronkelijke eindpunt vereist dat de gegevens moeten worden verwerkt, die verwachting niet is voldaan en dat het eindpunt op de een of andere manier de wijziging moet detecteren en instellen.

Het ExtensionDataObject type bevat geen openbare methoden of eigenschappen. Het is dus onmogelijk om directe toegang te krijgen tot de gegevens die in de ExtensionData eigenschap zijn opgeslagen.

De retourfunctie kan worden uitgeschakeld door in te stellen op de constructor of door de IgnoreExtensionDataObject eigenschap true in te stellen op de ServiceBehaviorAttribute.DataContractSerializertrueignoreExtensionDataObject Wanneer deze functie is uitgeschakeld, vult de deserializer de ExtensionData eigenschap niet in en verzendt de serializer de inhoud van de eigenschap niet.

Zie ook