当前位置:  开发笔记 > 编程语言 > 正文

与WCF服务共享枚举

如何解决《与WCF服务共享枚举》经验,为你挑选了3个好方法。

我有几个不同的应用程序,其中我想分享一个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服务和其他应用程序之间共享一个枚举?



1> Szymon Rozga..:

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

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

枚举类型.枚举(包括标志枚举)是可序列化的.(可选)可以使用DataContractAttribute属性标记枚举类型,在这种情况下,参与序列化的每个成员都必须使用EnumMemberAttribute属性进行标记

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


建议避免在webservices中使用枚举,因为它们会产生微妙的向后兼容问题.请参见http://stackoverflow.com/a/788281/52277

2> Keith G..:

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

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]的外部库中标记它.



3> Pilsator..:

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


我希望我能把你的答案投票十亿次.我只花了两个小时展开数据合同,看看导致问题的是什么属性.雅知道WCF团队有时会将枚举映射到数据库中的查找表,通常第一个条目是一个而不是零.
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有