Ошибка проверки экземпляра: "2" не является допустимым значением для QueryType. (веб-служба)

У меня есть веб-служба, которую я передаю перечисление

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

когда я передаю объект, который имеет параметр QueryType на нем, я получаю сообщение об ошибке от веб-службы:

'2' не является допустимым значением для QueryType

когда вы можете ясно видеть из объявления перечисления, что это.

Я не могу изменить значения перечисления, потому что устаревшие приложения используют значения, но мне бы не хотелось вставьте значение "по умолчанию", чтобы просто нажать индекс перечисления, чтобы заставить его работать с моей веб-службой. Он действует так, как веб-служба использует индекс значений, а не сами значения.

3 ответов


Я предполагаю, что вы используете веб-службы 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 " в службу, оно должно быть десериализовано должным образом, но вы теряете значение значений перечисления.


попробуйте добавить Flags() атрибут определения QueryType.


что-то нужно учитывать, чтобы убедиться, что вы инициализируете свои значения перечисления и не предполагаете, что будет использоваться первый элемент из вашего списка.

например, наличие перечисления, которое не начинается со значения 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

если структура данных, которую вы возвращаете через веб-сервис, имеет переменную enum, прикрепленную к ней, вы получите ошибка экземпляра при вызове извне веб-службы (но если вы используете dataclass из веб-службы, у вас не будет ошибок).

точка, просто убедитесь, что вы правильно инициализировали свой экземпляр перечисления, который вы возвращаете в веб-сервис.