이후 버전과 호환되는 데이터 계약

WCF(Windows Communication Foundation) 데이터 계약 시스템의 특징은 시간에 따라 변경되지 않는 방법으로 계약을 개발할 수 있다는 점입니다. 즉, 이전 버전의 데이터 계약을 가진 클라이언트가 새 버전의 동일한 데이터 계약을 가진 서비스와 통신할 수 있거나, 새 버전의 데이터 계약을 가진 클라이언트가 이전 버전의 동일한 데이터 계약과 통신할 수 있습니다. 자세한 내용은 모범 사례: 데이터 계약 버전 관리를 참조하세요.

새 버전의 기존 데이터 계약을 작성하는 경우 필요한 기준에 따라 대부분의 버전 관리 기능을 적용할 수 있습니다. 그러나 제대로 작동하려면 버전 관리 기능 중 하나인 라운드트립을 최초 버전의 형식으로 빌드해야 합니다.

라운드트립

라운드트립은 데이터를 새 버전에서 기존 버전으로 전달한 후 다시 새 버전의 데이터 계약으로 전달할 때 발생합니다. 라운드트립을 사용해도 데이터는 손실되지 않습니다. 라운드트립을 사용하면 데이터 계약 버전 관리 모델에서 지원하는 이후 모든 변경 사항에 대해 이후 버전과 호환되는 형식으로 만들 수 있습니다.

특정 형식의 라운드트립을 사용하려면 형식이 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 형식에는 public 메서드 또는 속성이 없습니다. 따라서 ExtensionData 속성 내에 저장된 데이터에 직접 액세스할 수 없습니다.

라운드트립 기능은 ignoreExtensionDataObject 생성자에서 trueDataContractSerializer로 설정하거나 IgnoreExtensionDataObject에서 true 속성을 ServiceBehaviorAttribute로 설정하여 해제할 수 있습니다. 이 기능을 해제하면 역직렬 변환기가 ExtensionData 속성을 채우지 않고, serializer가 속성의 콘텐츠를 내보내지 않습니다.

참고 항목