在WCF服务中使用枚举

时间:2011-05-06 00:03:53

标签: wcf web-services

我有一个用c#编写的WCF Web服务 我有一个枚举

[DataContract(Namespace = "NameSpace")]
public enum State
{
        [EnumMember]
        NotAvailable = 1,
        [EnumMember]
        RunningTests = 3,
        [EnumMember]
        ReadyForTests = 4,
        [EnumMember]
        HungOrBroken = 5
}

然后我运行以下命令来生成我可以在我的MFC应用程序中使用的.h,.cpp文件。

svcutil.exe /t:metadata <webservice dll>
WSUtil.exe /prefix:Ws *.wsdl *.xsd

以上命令生成具有以下内容的文件:

typedef enum WsState
{
    WsStateHungOrBroken = 0,
    WsStateNotAvailable = 1,
    WsStateReadyForTests = 2,
    WsStateRunningTests = 3,
}

我理解为什么枚举值不完全匹配(info)。一切都按预期工作,除了当我将WsStateHungOrBroken传递给Web服务时,它无法正确解释它并简单地将其转换为0.它应该是5,这就是它在Web服务中的定义。

如果有人能向我解释为什么会这样或者我如何进一步调试,那将是有用的。作为一个注释,我已经尝试过SvcTraceViewer,但没有运气找出服务和我的应用程序之间传递的数据。

修改:在http://thorarin.net/blog/post/2010/08/08/Controlling-WSDL-minOccurs-with-WCF.aspx#comment找到解决方案 默认情况下,所有WCF方法参数都是IsRequired = False,当枚举值为0时,WCF将其视为空值,并且根本不将其传递给服务且服务使用默认值。制作所需的所有参数可以解决问题。

1 个答案:

答案 0 :(得分:1)

你提供的link告诉你为什么会这样。 enum的数值不会保留。由于HungOrBroken按字母顺序排在第一位,因此客户端的值为0。

这正是您在问题中发布的内容。