Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una característica del sistema de contratos de datos de Windows Communication Foundation (WCF) es que los contratos pueden evolucionar a lo largo del tiempo sin causar interrupciones. Es decir, un cliente con una versión anterior de un contrato de datos puede comunicarse con un servicio con una versión más reciente del mismo contrato de datos o un cliente con una versión más reciente de un contrato de datos puede comunicarse con una versión anterior del mismo contrato de datos. Para obtener más información, consulte Procedimientos recomendados: Control de versiones del contrato de datos.
Puede aplicar la mayoría de las características de control de versiones según sea necesario cuando se creen nuevas versiones de un contrato de datos existente. Sin embargo, una característica del control de versiones, round-tripping (recorrido de ida y vuelta), debe estar integrada en el tipo de la primera versión para que funcione correctamente.
Round-Tripping (recorrido de ida y vuelta)
El recorrido de ida y vuelta se produce cuando los datos pasan de una nueva versión a una versión anterior y vuelven a la nueva versión de un contrato de datos. El recorrido de ida y vuelta garantiza que no se pierdan datos. Habilitar el round-tripping hace que el tipo sea compatible por adelantado con cualquier cambio futuro admitido por el modelo de control de versiones del contrato de datos.
Para habilitar la ida y vuelta para un tipo determinado, el tipo debe implementar la IExtensibleDataObject interfaz. La interfaz contiene una propiedad, ExtensionData (devuelve el tipo ExtensionDataObject). La propiedad almacena cualquier dato de versiones futuras del contrato de datos que sea desconocido por la versión actual.
Ejemplo
El siguiente contrato de datos no es compatible con los cambios futuros.
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
Para que el tipo sea compatible con los cambios futuros (como agregar un nuevo miembro de datos denominado "phoneNumber"), implemente la IExtensibleDataObject interfaz .
[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
Cuando la infraestructura de WCF encuentra datos que no forman parte del contrato de datos original, los datos se almacenan en la propiedad y se conservan. No se procesa de ninguna otra manera, excepto para el almacenamiento temporal. Si el objeto se devuelve a donde se originó, también se devuelven los datos originales (desconocidos). Por lo tanto, los datos han realizado un recorrido de ida y vuelta hacia y desde el punto de conexión de origen sin pérdida. Tenga en cuenta, sin embargo, que si el punto de conexión de origen requiere que se procesen los datos, esa expectativa no se cumple y el punto de conexión debe detectar y acomodar el cambio de alguna manera.
El ExtensionDataObject tipo no contiene métodos o propiedades públicos. Por lo tanto, es imposible obtener acceso directo a los datos almacenados dentro de la ExtensionData propiedad .
La característica de round-tripping puede desactivarse, estableciendo ignoreExtensionDataObject
en true
en el constructor DataContractSerializer o estableciendo la propiedad IgnoreExtensionDataObject en true
en el ServiceBehaviorAttribute. Cuando esta característica está desactivada, el deserializador no rellenará la ExtensionData propiedad y el serializador no emitirá el contenido de la propiedad.