Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Una funzionalità del sistema di contratto di dati della Windows Communication Foundation (WCF) è che i contratti possono evolversi nel tempo in modi non interrompenti. Ovvero, un client con una versione precedente di un contratto dati può comunicare con un servizio con una versione più recente dello stesso contratto dati o un client con una versione più recente di un contratto dati può comunicare con una versione precedente dello stesso contratto dati. Per altre informazioni, vedere Procedure consigliate : Controllo delle versioni del contratto dati.
È possibile applicare la maggior parte delle funzionalità di controllo delle versioni in base alle esigenze quando vengono create nuove versioni di un contratto dati esistente. Tuttavia, una funzionalità di versioning, round-tripping, deve essere integrata nel tipo sin dalla prima versione per funzionare correttamente.
Round-Tripping
Il round-tripping si verifica quando i dati passano da una nuova versione a una versione precedente e tornano alla nuova versione di un contratto di dati. Il round trip garantisce che non vengano persi dati. L'abilitazione del "round-tripping" rende il tipo compatibile con eventuali modifiche future supportate dal modello di versionamento dei contratti dati.
Per abilitare il round-tripping per un particolare tipo, il tipo deve implementare l'interfaccia IExtensibleDataObject . L'interfaccia contiene una proprietà , ExtensionData che restituisce il ExtensionDataObject tipo . La proprietà memorizza e archivia i dati di qualsiasi versione futura del contratto di dati che sono sconosciuti alla versione corrente.
Esempio
Il contratto dati seguente non è compatibile con le modifiche future.
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
Per rendere il tipo compatibile con le modifiche future , ad esempio l'aggiunta di un nuovo membro dati denominato "phoneNumber", implementare l'interfaccia IExtensibleDataObject .
[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
Quando l'infrastruttura WCF rileva dati che non fanno parte del contratto dati originale, i dati vengono archiviati nella proprietà e mantenuti. Non viene elaborato in altro modo, ad eccezione dell'archiviazione temporanea. Se l'oggetto viene restituito al percorso di origine, vengono restituiti anche i dati originali (sconosciuti). Di conseguenza, i dati hanno effettuato un round trip da e verso l'endpoint di origine senza perdita. Si noti, tuttavia, che se l'endpoint di origine richiede l'elaborazione dei dati, tale aspettativa non è soddisfatta e l'endpoint deve in qualche modo rilevare e gestire la modifica.
Il ExtensionDataObject tipo non contiene metodi o proprietà pubblici. Pertanto, è impossibile ottenere l'accesso diretto ai dati archiviati all'interno della ExtensionData proprietà .
La funzionalità di round tripping può essere disattivata, impostando ignoreExtensionDataObject
su true
nel costruttore DataContractSerializer o impostando la proprietà IgnoreExtensionDataObject su true
su ServiceBehaviorAttribute. Quando questa funzionalità è disattivata, il deserializzatore non popola la ExtensionData proprietà e il serializzatore non genererà il contenuto della proprietà.