我在从WCF客户端传递多个enum
值时遇到问题。
class Client
{
static void Main(string[] args)
{
ChannelFactory<IWCFService> channelFactor = new ChannelFactory<IWCFService>("HellowWorldServiceEndpoint");
channelFactor.Open();
IWCFService proxy = channelFactor.CreateChannel();
Console.WriteLine(proxy.GetEnumString(EnumComponents.enumVal1)); // -> SUCCEDED HERE (only one Enum value)
// Console.WriteLine(proxy.GetEnumString(EnumComponents.enumVal1| EnumComponents.enumVal2)); // -> **** FAILS HERE with invalid enum type. *****
Console.Read();
}
}
例外是, 尝试序列化参数http://tempuri.org/:components时出错。 InnerException消息是'枚举值'enumVal1,enumVal2'对于类型'Microsoft.Geospatial.Data.Gateway.ObjectModel.EnumComponents'无效且无法序列化。确保存在必要的枚举值,并且如果类型具有DataContractAttribute属性,则使用EnumMemberAttribute属性标记。有关详细信息,请参阅InnerException
仅供参考,枚举来自于在WCFclient,WCFserver和WCF接口中作为引用添加的公共库。
如果它是正常的函数调用,则相同。有没有办法解决这个问题?
答案 0 :(得分:0)
您发送大量|
- ed enum
值的唯一原因是enum
符号标记。
WCF
supports在少数情况下enums
使用DataContract
- 其中一个是 标记枚举 。
如果您的enum
FlagsAttribute
装饰它,则序列化按以下方式完成:
- 尝试查找映射到数值的枚举成员(已应用EnumMemberAttribute属性)。如果找到,请发送仅包含该成员的列表。
- 尝试将数值分解为一个总和,使得枚举成员(每个都应用了EnumMemberAttribute属性)映射到总和的每个部分。发送所有这些成员的列表。注意,贪婪算法用于找到这样的总和,因此不能保证即使它存在也能找到这样的总和。要避免此问题,请确保枚举成员的数值为2的幂。
- 如果前两个步骤失败,并且数值非零,则抛出SerializationException。如果数值为零,则发送空列表。
因此,您需要您的枚举如下所示:
[DataContract]
[Flags]
enum EnumComponents
{
[EnumMember]
enumVal1,
[EnumMember]
enumVal2
}
如果enum
来自外部来源并且没有FlagsAttribute
,则必须将数值分解为自己用EnumMemberAttribute
装饰的枚举成员的总和。