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

Ant*_*haw 8 c# enums wsdl web-services

我有一个Web服务,我通过枚举

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}
Run Code Online (Sandbox Code Playgroud)

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

'2'不是QueryType的有效值

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

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

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

Ran*_*ica 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>
Run Code Online (Sandbox Code Playgroud)


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

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

public enum QueryType 
{
    [XmlEnum("1")]
    Inquiry = 1,
    [XmlEnum("2")]
    Maintainence = 2
}
Run Code Online (Sandbox Code Playgroud)


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

<s:simpleType name="QueryType">
  <s:restriction base="s:string">
    <s:enumeration value="1" /> 
    <s:enumeration value="2" /> 
  </s:restriction>
</s:simpleType>
Run Code Online (Sandbox Code Playgroud)


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