C# 与WCF服务共享枚举

C# 与WCF服务共享枚举,c#,wcf,enums,C#,Wcf,Enums,我有几个不同的应用程序,其中我想共享一个C#enum。我不太明白如何在常规应用程序和WCF服务之间共享枚举声明 情况是这样的。我有两个轻量级C#destop应用程序和一个WCF Web服务,它们都需要共享枚举值 客户1已经 Method1( MyEnum e, string sUserId ); 客户2已经 Method2( MyEnum e, string sUserId ); Web服务已经 ServiceMethod1( MyEnum e, string sUserId, strin

我有几个不同的应用程序,其中我想共享一个C#enum。我不太明白如何在常规应用程序和WCF服务之间共享枚举声明

情况是这样的。我有两个轻量级C#destop应用程序和一个WCF Web服务,它们都需要共享枚举值

客户1已经

 Method1( MyEnum e, string sUserId );
客户2已经

Method2( MyEnum e, string sUserId );
Web服务已经

ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
我最初的想法是创建一个名为Common.dll的库来封装枚举,然后在需要枚举的所有项目中引用该库。然而,WCF使事情变得困难,因为您需要将枚举标记为服务的一个组成部分。像这样:

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };  

所以。。。。有没有办法在WCF服务和其他应用程序之间共享枚举

使用公共库应该可以。枚举是可序列化的,不需要DataContract属性

见:

枚举类型。枚举(包括标志枚举)是 可序列化。或者,枚举类型可以用 DataContractAttribute属性,在这种情况下 参与序列化的必须用标记 EnumMemberAttribute属性


编辑:尽管如此,将枚举标记为DataContract并让客户端库使用它应该没有问题。

您可以将int值分配给枚举成员,只需使用int值进行传输,必要时将其重新转换为枚举类型。

我一定遇到了过时的服务引用或其他问题。我回去创建了一个包含枚举的公共库,一切正常。我只是向服务接口的文件添加了一个using引用

using Common;  

[ServiceContract]
[ServiceKnownType(typeof(MyEnum))]
public interface IMyService
{
    [OperationContract]
    ServiceMethod1( MyEnum e, string sUserId, string sSomeData);
}
我删除了以下内容:

[DataContract]
public enum MyEnum{ [EnumMember] red, [EnumMember] green, [EnumMember] blue };

我想,由于枚举是通过ServiceKnownType引用的,因此不需要在外部库中用[DataContract]或[Enumerator]标记它。

我遇到了一个非常奇怪的问题,我认为您可能会感兴趣。当我在数据契约中使用枚举时,我也遇到了连接停止的问题。我花了很长时间才发现真正的问题是什么:我使用了分配了int值的枚举。它们从1开始,而不是从0开始。显然,WCF要求序列化时有一个等于0的枚举值。如果您没有在枚举中声明任何值,则会从0开始自动进行int值映射,因此一切正常。但是,当您复制粘贴其他未指定0值的枚举定义时,您将无法通过WCF将其发送到客户端-奇怪,但却是真的

对我来说很好。谢谢对我来说也很好。谢谢我希望我能对你的答案投十亿次赞成票。我只是花了两个小时解除数据合同,看看是什么属性导致了问题。你们知道WCF团队有时会将枚举映射到数据库中的查找表,其中第一个条目通常是一而不是零。MotoWilliams基本上说的正是我想说的。在尝试解决这个问题一段时间后找到了这个答案,直到我找到了这个解决方案。对我来说效果很好。我也遇到了这个微妙的错误,很难调试。MSDN文档中提到,零值的枚举不会被序列化(或者更准确地说,没有映射的枚举值)。哦,是的,这不仅仅是真的,我为这个问题搜索了几个小时。wcf例外情况可以在这里更详细!!!!!这方面的文档记录非常少,错误消息毫无帮助。非常感谢您-在找到您的答案之前,我已经清除了所有枚举!情况就是这样!另外-确保在实现零值枚举后删除并重新添加引用,否则svc引用未正确更新,仍然会在反序列化时出错!建议避免Web服务中的枚举,因为它们会产生微妙的向后兼容问题。请参阅,建议避免Web服务中的枚举,因为它们会产生微妙的向后兼容问题。See不适用于这种情况;所提到的向后兼容性问题是由于将枚举返回给客户端(这很明显会破坏它们)而不是将枚举作为输入。违背了枚举的目的。