Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Особенность системы контракта данных Windows Communication Foundation (WCF) заключается в том, что контракты могут развиваться с течением времени в неразрывных способах. То есть клиент с более старой версией контракта данных может взаимодействовать со службой с более новой версией того же контракта данных, или клиент с более новой версией контракта данных может взаимодействовать с более старой версией того же контракта данных. Дополнительные сведения см. в статье "Рекомендации по управлению версиями контракта данных".
Большинство функций управления версиями можно применять по мере необходимости при создании новых версий существующего контракта данных. Однако для правильной работы одной функции управления версиями необходимо встроить в тип из первой версии.
Round-Tripping
Циклический обход происходит при переходе данных из новой версии в старую версию и обратно в новую версию контракта данных. Циклический обход гарантирует, что данные не будут потеряны. Включение кругового обхода обеспечивает совместимость типа с любыми будущими изменениями, поддерживаемыми моделью управления версиями контракта данных.
Чтобы включить циклический обход для определенного типа, тип должен реализовать IExtensibleDataObject интерфейс. Интерфейс содержит одно свойство ExtensionData (возвращающее ExtensionDataObject тип). Свойство сохраняет все данные из будущих версий контракта данных, неизвестного текущей версии.
Пример
Следующий контракт данных не совместим с будущими изменениями.
[DataContract]
public class Person
{
[DataMember]
public string fullName;
}
<DataContract()> _
Public Class Person
<DataMember()> _
Public fullName As String
End Class
Чтобы обеспечить совместимость типа с будущими изменениями (например, добавление нового члена данных с именем PhoneNumber), реализуйте 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
Когда инфраструктура WCF обнаруживает данные, которые не являются частью исходного контракта данных, данные хранятся в свойстве и сохраняются. Он не обрабатывается каким-либо другим способом, кроме временного хранилища. Если объект возвращается обратно в место его происхождения, возвращаются исходные (неизвестные) данные. Таким образом, данные совершили круговую поездку в исходную конечную точку и из нее без потери. Обратите внимание, что если исходная конечная точка требует обработки данных, это ожидание не удается, и конечная точка должна каким-то образом обнаруживать и учитывать изменения.
Тип ExtensionDataObject не содержит открытых методов или свойств. Таким образом, невозможно получить прямой доступ к данным, хранящимся внутри ExtensionData свойства.
Функция круговой передачи может быть отключена либо путем ignoreExtensionDataObjecttrue настройки в DataContractSerializer конструкторе, либо путем задания IgnoreExtensionDataObject свойства true в параметре ServiceBehaviorAttribute. Если эта функция отключена, десериализатор не заполняет ExtensionData свойство, а сериализатор не будет выдавать содержимое свойства.