【问题标题】:Instance validation error: '2' is not a valid value for QueryType. (web service)实例验证错误:“2”不是 QueryType 的有效值。 (网络服务)
【发布时间】:2009-09-15 20:31:21
【问题描述】:

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

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

当我传递一个具有 QueryType 参数的对象时,我从 Web 服务返回错误消息:

'2' 不是 QueryType 的有效值

当您从枚举的声明中可以清楚地看到它时。

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

是否有人建议我可以做些什么来使它工作,我可以在我的 WSDL 中更改什么吗?

【问题讨论】:

  • 您确定 Web 服务中的二进制文件是最新的吗?当我编译一个库项目并忘记将 DLL 复制到 Web 服务文件夹时,我看到过类似的东西。
  • 不,我不确定,但是我知道该枚举的签名没有改变。这还会导致这个问题吗?我将尝试使用最新的 DLL 更新 Web 服务,看看是否会有所作为。谢谢保罗!
  • 保罗,不幸的是,这不起作用。看起来它真的是在尝试采用枚举的零索引而不是按值
  • 某处是否还有另一个 QueryType 枚举? MSDN 帮助说 Microsoft.SharePoint.Dsp 中有一个。
  • 我不确定。在我有更多时间使用它之前,我最终在过渡期间所做的是将其值转换为 int 并将 int 传递给服务,然后将其重新转换为 Web 服务端的 QueryType。似乎这样工作正常

标签: c# web-services enums wsdl


【解决方案1】:

我假设您正在使用 asmx 网络服务来回答这个问题。

您的猜测是正确的——XML 序列化程序使用 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 序列化器您要使用哪些值。您可以使用 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”传递给服务,那么它应该被正确反序列化,但您失去了枚举值的含义。

【讨论】:

  • 不幸的是,这也没有改变我收到的错误。
  • 我将尝试发布一个更好的代码示例来说明我正在使用的内容。也许这是我们在 DLL 和 Web 服务中所做的一些奇怪的事情。
  • 是的,请提供样本。
  • 这解决了我的问题。我的问题是,我必须对已经存在了很长时间的代码执行此操作。我想知道是什么改变导致我不得不将 XMLEnum 添加到我的枚举值中?
  • 这也发生在我身上,我的代码已经存在了一段时间。很奇怪。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    例如,定义的枚举不是从 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
    

    如果您通过网络服务返回的数据结构附加了一个枚举变量,如果从网络服务外部调用,您将收到实例错误(但如果您使用网络服务内部的数据类,则不会出现错误)。

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

    【讨论】:

    • 如果您回头看最初的问题,这些值正在被初始化。一旦它被发送到 Web 服务,Web 服务就会忽略这些值并使用他的枚举名称。
    猜你喜欢
    • 2014-04-10
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多