我听说有些人说枚举是邪恶的,不应该在Web服务中使用,因为如果分配了一些值,或者枚举标记了Flags属性,服务器和客户端之间可能会出现不匹配.他们还说,暴露枚举的网络服务难以维护,但实际上并没有给我可行的论据.那么根据您的经验,在WCF Web服务中使用枚举的优缺点是什么?
人们建议在Web服务中避免使用枚举的原因是因为它们会产生微妙的向后兼容问题.
这同样适用于常规枚举,但在Web服务中,问题在.NET生成的代理中尤为明显(见下文).
如果只输入枚举,则表示没有问题.
如果枚举可以是out参数,那么如果添加新元素并将其返回,则旧客户端可能会出现问题:
如果客户端使用.NET生成的代理,它将在调用者处理它之前中断(在反序列化中)
即使生成的代理代码支持更改(例如,如果它将枚举映射到字符串),客户端中的用户代码也可能无法正确处理新的意外值(它可能很容易成为永不执行的路径)
通过将参数定义为字符串,您可以向API用户表明该值可能在将来发生变化.即使你认为价值永远不会改变,也是一个好的做法.
Dare Obasanjo就这一主题发表了一篇好文章.
我在WCF中使用了枚举,也在互操作性场景中使用了枚举.如果您控制服务的两面,则更容易使用.如果您只控制服务的一方,则需要注意您提到的问题.
枚举比字符串变量要好得多,或者你可以选择使用什么.使用字符串而不是枚举是SOA中称为"松散的Goosey"的反模式.
WSDL和XSD通过xsd:enumeration
schema元素完全支持枚举.它为单值和标志样式枚举提供支持,其中flags枚举中的多个值由空格分隔.
因此,对于任何符合标准的平台使用枚举应该没有问题.