与WCF服务共享枚举

时间:2008-10-09 14:25:26

标签: c# wcf enums

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

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

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

4 个答案:

答案 0 :(得分:46)

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

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

  

枚举类型。枚举,包括标志枚举,是   序列化。可选地,枚举类型可以用。标记   DataContractAttribute属性,在这种情况下每个成员都有   参与序列化必须标有   EnumMemberAttribute属性

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

答案 1 :(得分:34)

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

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 };

我猜因为enum是通过ServiceKnownType引用的,所以不需要在[DataContract]或[Enumerator]

的外部库中标记它

答案 2 :(得分:32)

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

答案 3 :(得分:0)

你可以为你的枚举成员分配int值,只需使用int进行传输,并在必要时将它们重新放回你的枚举类型