我有一个正在传递枚举的 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/