Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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, round-tripping, måste byggas in i typen från den första versionen för att fungera korrekt.
Round-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. Rundresa garanterar att ingen information går förlorad. 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 rundresor 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 dessa data i attributet 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 round-tripping kan inaktiveras, antingen genom att ställa in ignoreExtensionDataObject på true i DataContractSerializer-konstruktorn eller genom att ställa in IgnoreExtensionDataObject-egenskapen till true på ServiceBehaviorAttribute. När den här funktionen är avstängd kommer deserialiseraren inte att fylla egenskapen ExtensionData, och serialiseraren kommer inte att generera innehållet i egenskapen.