我可以确认您可以添加到已发布的枚举而不会破坏兼容性,只要您在与服务通信时不使用新值即可.但请注意,如果您实际尝试将类发送到使用新枚举值的服务,您将获得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)
我建议不要通过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)
这样,您的旧客户就会感到满意.