Contratti dati compatibili con versioni successive

Una funzionalità del sistema di contratto dati Windows Communication Foundation (WCF) è che i contratti possono evolversi nel tempo in modi non breaking. Ovvero, un client con una versione precedente di un contratto dati può comunicare con un servizio dotato di una versione più recente dello stesso contratto dati, oppure un client con una versione più recente di un contratto dati può comunicare con un client dotato di una versione precedente dello stesso contratto dati. Per altre informazioni, vedere Procedure consigliate: controllo delle versioni del contratto di dati.

È possibile applicare, in base alle esigenze, la maggior parte delle funzionalità di controllo delle versioni quando vengono create versioni nuove di un contratto dati esistente. Per funzionare correttamente, tuttavia, la funzionalità di controllo delle versioni sequenza di andata e ritorno deve essere generata nel tipo della prima versione.

Sequenze di andata e ritorno

Le sequenze di andata e ritorno si verificano quando i dati passano da una versione nuova a una versione precedente e di nuovo alla versione nuova di un contratto dati. Le sequenze di andata e ritorno garantiscono che non vi sarà perdita di dati. L'attivazione delle sequenze di andata e ritorno rende il tipo compatibile con versioni successive con eventuali modifiche future supportate dal modello di controllo delle versioni del contratto dati.

Per consentire sequenze di andata e ritorno per un particolare tipo, quest'ultimo deve implementare l'interfaccia IExtensibleDataObject. L'interfaccia contiene una proprietà, ExtensionData, che restituisce il tipo ExtensionDataObject. La proprietà archivia qualsiasi dato da versioni future del contratto dati che è sconosciuto alla versione corrente.

Esempio

Il contratto dati seguente non è compatibile con 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, questi vengono archiviati nella proprietà e conservati. Tali dati non vengono elaborati in nessun altro modo a parte l'archiviazione temporanea. Se l'oggetto viene restituito di nuovo all'origine, anche i dati originali (sconosciuti) vengono restituiti. I dati, pertanto, hanno eseguito sequenze di andata e ritorno dall'endpoint di origine senza perdite. Si noti che se l'endpoint di origine, tuttavia, ha richiesto l'elaborazione dei dati, questa aspettativa rimane insoddisfatta e l'endpoint deve in qualche modo rilevare e accogliere la modifica.

Il tipo ExtensionDataObject non contiene metodi o proprietà pubblici. Di conseguenza, è impossibile ottenere accesso diretto ai dati archiviati all'interno della proprietà ExtensionData.

La funzionalità delle sequenze di andata e ritorno può essere disattivata, impostando ignoreExtensionDataObject su true nel costruttore DataContractSerializer o impostando la proprietà IgnoreExtensionDataObject su true in ServiceBehaviorAttribute. Quando questa funzionalità è disattivata, il deserializzatore non popolerà la proprietà ExtensionData e il serializzatore non creerà il contenuto della proprietà.

Vedi anche