WCF版本控制枚举

Gar*_*eth 9 .net versioning wcf enums

我开始编写一些需要向前兼容和版本化的WCF数据协定.我一直在阅读这里的MSDN文章,并想知道是否有人对关于枚举的#14点进行了澄清.内容如下:

14.您不应在版本之间添加或删除枚举成员.除非使用EnumMemberAttribute属性上的Name属性将其名称保持在数据协定模型中,否则也不应重命名枚举成员.

阅读本文,我认为一旦enum发布(并由客户端使用),你无论如何都不能修改它(主要添加/删除)而不破坏兼容性?(即这将是一个突破性的变化)

有人能证实吗?

Rya*_*sen 8

我可以确认您可以添加到已发布的枚举而不会破坏兼容性,只要您在与服务通信时不使用新值即可.但请注意,如果您实际尝试将类发送到使用新枚举值的服务,您将获得System.ServiceModel.CommunicationException.

There was an error while trying to serialize parameter myType. The InnerException message was 'Enum value 'x' is invalid for type 'myType' and cannot be serialized. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.'.  Please see InnerException for more details.
Run Code Online (Sandbox Code Playgroud)


Lau*_*rpf 7

我建议不要通过WCF接口发送枚举.假设您有以下枚举:

[DataContract]
public enum WeekdayEnum
{
    [EnumMember]
    Monday = 0
}
Run Code Online (Sandbox Code Playgroud)

如果你通过WCF返回枚举,一切都会运行良好:

[ServiceContract]
public class Service1
{
    [OperationContract]
    public List<WeekdayEnum> GetWeekdays()
    {
        return new List<WeekdayEnum> { WeekdayEnum.Monday };
    }
}
Run Code Online (Sandbox Code Playgroud)

添加到枚举而不更新客户端中的服务引用,您仍然可以:

[DataContract]
public enum WeekdayEnum
{
    [EnumMember]
    Monday = 0,
    [EnumMember]
    Tuesday = 1
}
Run Code Online (Sandbox Code Playgroud)

但是,如果在不更新客户端服务引用的情况下从服务返回添加的值,则旧版客户端将中断:

[ServiceContract]
public class Service1
{
    [OperationContract]
    public List<WeekdayEnum> GetWeekdays()
    {   // NetDispatcherFaultException on legacy clients that only have Monday
        return new List<WeekdayEnum> { WeekdayEnum.Monday, WeekdayEnum.Tuesday };
    }
}
Run Code Online (Sandbox Code Playgroud)

在支持旧版客户端很重要的项目中,我遇到了这个问题.解决方案是简单地通过WCF而不是枚举发送DTO.例如,可以通过在简单的DTO上发送值来替换WeekdayEnum:

[DataContract]
public class WeekdayDto
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这样,您的旧客户就会感到满意.