实例验证错误:'2'不是QueryType的有效值。 (网络服务)

时间:2009-09-15 20:31:22

标签: c# web-services enums wsdl

我有一个Web服务,我正在传递一个枚举

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

当我传递一个参数为QueryType的对象时,我从Web服务中收到错误消息:

  

'2'不是QueryType的有效值

当你可以从enum的声明中清楚地看到它是。

我无法更改枚举的值,因为遗留应用程序使用这些值,但我宁愿不必插入“默认”值来推送枚举的索引以使其与我的Web服务一起使用。它就像Web服务使用值的索引而不是值本身。

是否有人建议我可以做些什么来使其工作,我的WSDL中是否可以更改某些内容?

3 个答案:

答案 0 :(得分:7)

我假设您正在使用asmx Web服务来获得此答案。

您的猜测是正确的 - XML Serializer使用WSDL中的枚举名称而不是值。

如果你看一下你的WSDL,它将看起来像这样:

<s:simpleType name="QueryType">
  <s:restriction base="s:string">
    <s:enumeration value="Inquiry" /> 
    <s:enumeration value="Maintainence" /> 
  </s:restriction>
</s:simpleType>


因此,当您调用服务时,它期望一个字符串,该字符串是枚举成员的名称。使用.NET代理时,通常会为您处理此转换。如果将值传递给无法反序列化为枚举值的服务,您将收到您正在看到的消息。

要解决此问题,您可以确保向其发送预期值,或者,如果这对您不起作用,您可以告诉XML Serializer您要使用哪些值。您可以使用XmlEnum属性执行此操作:

public enum QueryType 
{
    [XmlEnum("1")]
    Inquiry = 1,
    [XmlEnum("2")]
    Maintainence = 2
}


这将生成以下模式片段(来自WSDL):

<s:simpleType name="QueryType">
  <s:restriction base="s:string">
    <s:enumeration value="1" /> 
    <s:enumeration value="2" /> 
  </s:restriction>
</s:simpleType>


然后,如果您将值“2”传递给服务,那么它应该被正确反序列化,但是您将失去枚举值的含义。

答案 1 :(得分:2)

尝试将Flags()属性添加到QueryType定义中。

答案 2 :(得分:0)

需要考虑的是确保初始化枚举值,而不是假设将使用列表中的第一项。

例如,定义的枚举不是从int值0开始的,例如:

 public enum EnumCategoryID
        {
            TOOTH_PASTE = 1,
            TOOTH_BRUSHES = 2,
            HOT_BEVERAGES = 3,
            ENERGY_DRINKS = 4,
            OVER_THE_COUNTER = 5,
            IN_STORE = 6
        }

通常,当您声明枚举实例时,您可能会想要这样做:

EnumCategoryID anID; //Assuming the value will be 'TOOTH_PASTE' when used

如果通过webservice返回的数据结构附加了一个枚举变量,那么如果从webservice外部调用,则会收到实例错误(但如果使用webservice中的数据类,则没有错误)。

重点是,请确保您已正确初始化了您在Web服务中返回的枚举实例。