Ошибка проверки экземпляра: «2» не является допустимым значением для QueryType. (веб-сервис) - PullRequest
8 голосов
/ 16 сентября 2009

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

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

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

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

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

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

Есть ли у кого-нибудь предложения о том, что я могу сделать, чтобы это работало, есть ли что-то, что я могу изменить в моем WSDL?

Ответы [ 3 ]

7 голосов
/ 18 сентября 2009

Я предполагаю, что вы используете asmx web-сервисы для этого ответа.

Ваше предположение верно - 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, это преобразование обычно обрабатывается для вас. Если в службу передается значение, которое не может быть десериализовано в значение enum, вы получите сообщение, которое видите.

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

2 голосов
/ 30 марта 2010

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

0 голосов
/ 26 марта 2013

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

Например, определение enum, которое не начинается со значения int, равного 0, например:

 public enum EnumCategoryID
        {
            TOOTH_PASTE = 1,
            TOOTH_BRUSHES = 2,
            HOT_BEVERAGES = 3,
            ENERGY_DRINKS = 4,
            OVER_THE_COUNTER = 5,
            IN_STORE = 6
        }

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

EnumCategoryID anID; //Assuming the value will be 'TOOTH_PASTE' when used

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

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

...