我有一个Web服务,我正在传递一个枚举
public enum QueryType {
Inquiry = 1
Maintainence = 2
}
当我传递一个参数为QueryType的对象时,我从Web服务中收到错误消息:
'2'不是QueryType的有效值
当你可以从enum的声明中清楚地看到它是。
我无法更改枚举的值,因为遗留应用程序使用这些值,但我宁愿不必插入“默认”值来推送枚举的索引以使其与我的Web服务一起使用。它就像Web服务使用值的索引而不是值本身。
是否有人建议我可以做些什么来使其工作,我的WSDL中是否可以更改某些内容?
答案 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服务中返回的枚举实例。