Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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, round-tripping, moet echter vanaf de eerste versie in het type worden ingebouwd om goed te kunnen werken.
Round-Tripping
Round-tripping treedt op wanneer gegevens heen en weer gaan van een nieuwe versie naar een oude versie en weer terug naar de nieuwe versie van een gegevenscontract. Retourrondje garandeert dat er geen gegevens verloren gaan. Door round-tripping in te schakelen, wordt het type toekomstbestendig en compatibel met eventuele toekomstige wijzigingen die ondersteund worden door het versiebeheermodel van het datacontract.
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). De eigenschap slaat gegevens op van toekomstige versies van het gegevenscontract die onbekend zijn voor de huidige versie.
Voorbeeld
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 ze opgeslagen in een attribuut 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 zijn de gegevens heen en weer gegaan naar het oorspronkelijke eindpunt zonder dat er gegevens verloren zijn gegaan. 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, ofwel door ignoreExtensionDataObject
in de true
constructor op DataContractSerializer in te stellen, of door de IgnoreExtensionDataObject eigenschap op true
in te stellen op de ServiceBehaviorAttribute. Wanneer deze functie is uitgeschakeld, vult de deserializer de ExtensionData eigenschap niet in en verzendt de serializer de inhoud van de eigenschap niet.