2008-10-09 186 views
47

我有几个不同的应用程序,我想分享一个C#枚举。我无法弄清楚如何在常规应用程序和WCF服务之间共享一个枚举声明。与WCF服务共享枚举

这是情况。我有2个轻量级C#destop应用程序和一个WCF webservice,都需要共享枚举值。

客户端1具有

Method1(MyEnum e, string sUserId); 

客户端2具有

Method2(MyEnum e, string sUserId); 

Webservice的具有

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服务和其他应用程序之间共享一个枚举?

+0

建议避免在Web服务中枚举,因为它们会创建微妙的向后兼容问题。请参阅http://stackoverflow.com/a/788281/52277 – 2013-07-21 10:00:50

+1

不适用于此情况;引用的向后兼容性问题是由于将枚举返回给客户端(非常明显可以打破它们),而不是将枚举作为输入。 – 2013-08-03 00:07:28

回答

45

使用公共库应该没问题。枚举是可序列化的,并且不需要DataContract属性。

请参见: http://msdn.microsoft.com/en-us/library/ms731923.aspx

枚举类型。包括标志枚举在内的枚举是可串行化的 。或者,枚举类型可以打上 DataContractAttribute属性,在这种情况下,每一个成员都认为 参与了系列化必须与 EnumMemberAttribute标记属性

编辑:即便如此,应该没有问题,与具有枚举标记为DataContract并使用它的客户端库。

+4

建议避免在Web服务中枚举,因为它们会创建微妙的向后兼容问题。请参阅http://stackoverflow.com/a/788281/52277 – 2013-07-21 09:57:54

0

你可以分配INT值的枚举成员,只是使用int的转移,并在必要时将它们转换回到你的枚举类型

+4

击败枚举的目的。 – Gaui 2014-06-12 15:33:12

33

我必须有与过时的服务引用或某事的一些问题。我回去创建了一个包含枚举的公共库,并且一切正常。我只是添加了对服务接口文件的使用引用。

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]或[枚举]

+0

为我工作很好。谢谢! – Contango 2010-11-05 15:24:46

32

我有一个很奇怪的问题,并认为它可能会让你感兴趣。我在使用数据合同中的枚举时遇到了连接中断的问题。我花了很长时间才发现真正的问题是什么:我用int值赋值的枚举。它们从1开始,而不是从0开始。显然,WCF要求序列化时枚举值等于0。如果你没有在你的枚举中声明任何值,一个自动的int值映射将为你开始0,所以一切都很好。但是,当你复制粘贴其他枚举定义的0值没有被分配的时候,你不会通过WCF将它们传递给你的客户端 - 奇怪而真实!