与WCF服务共享枚举

本文关键字:枚举 共享 服务 WCF | 更新日期: 2023-09-27 17:48:52

我有几个不同的应用程序,我想在其中共享一个C#枚举。我不太清楚如何在常规应用程序和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服务和其他应用程序之间共享枚举?

与WCF服务共享枚举

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

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

枚举类型。枚举,包括标志枚举,包括可序列化。可选地,枚举类型可以标记为DataContractAttribute属性,在这种情况下参与序列化必须标记为EnumMemberAttribute属性

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

我一定有一些过时的服务引用之类的问题。我回去创建了一个包含枚举的公共库,一切都很好。我只是添加了一个对服务接口文件的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将其传递给你的客户端——奇怪但真实!

您可以将int值分配给Enum成员,只需使用int进行传输,并在必要时将其强制转换回您的Enum类型