c# - 实例验证错误 : '2' is not a valid value for QueryType.(Web 服务)

标签 c# web-services enums wsdl

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

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

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

'2' is not a valid value for QueryType

当你从枚举的声明中可以清楚地看出它是。

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

有没有人建议我可以做些什么来让它工作,有什么我可以在我的 WSDL 中改变的吗?

最佳答案

我假设您正在使用 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”传递给服务,那么它应该被正确反序列化,但您失去了枚举值的意义。

关于c# - 实例验证错误 : '2' is not a valid value for QueryType.(Web 服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1429457/

相关文章:

c# - 有时当我制作 BUILD > Rebuild Solution 时,我收到错误 : he build stopped unexpectedly because of a an internal failure why?

web-services - 确定 IP 地址邮政编码的免费网络服务

c# - 服务引用不会为 DateTime 创建 'specified' 属性

web-services - 什么是 RESTful Web 服务?

go - Golang获取类型常量的值

mysql - mysql 中的枚举或 boolean 值?

c# - 从代理服务器后面调用网络服务

c# - 小方法的函数调用是否会消耗内存.....在C#中

c# - 取决于类型 T 的枚举

c# - 为什么我的 ReadOnlySpan<char> 比我的字符串慢?