2009-09-15 17 views
8

Tengo un servicio web que estoy pasando una enumeraciónError de validación de instancia: '2' no es un valor válido para QueryType. (Servicio web)

public enum QueryType { 
    Inquiry = 1 
    Maintainence = 2 
} 

Cuando paso un objeto que tiene un parámetro de querytype en él, me sale el error de vuelta del servicio web diciendo:

'2' is not a valid value for QueryType

cuando se puede ver claramente en la declaración de la enumeración que es.

No puedo cambiar los valores de la enumeración porque las aplicaciones heredadas usan los valores, pero prefiero no tener que insertar un valor "predeterminado" solo para insertar el índice de la enumeración para que funcione con mi servicio web. Actúa como si el servicio web utilizara el índice de los valores en lugar de los valores mismos.

¿Alguien tiene alguna sugerencia de qué puedo hacer para que funcione, hay algo que pueda cambiar en mi WSDL?

+0

¿Estás seguro de que los archivos binarios en el servicio web están actualizados? He visto cosas como esta cuando compilo un proyecto de biblioteca y me olvido de copiar la DLL a las carpetas del servicio web. –

+0

No, no estoy seguro, sin embargo, sé que la firma de esa enumeración no ha cambiado. ¿Podría eso todavía causar este problema? Intentaré actualizar el servicio web con la DLL más actualizada y ver si eso hace la diferencia. Gracias Paul! –

+0

Paul, desafortunadamente eso no funcionó. Realmente parece que está intentando tomar el índice cero de la enumeración en lugar del valor –

Respuesta

7

Supongo que está utilizando los servicios web de asmx para esta respuesta.

Supongo que es correcto: el serializador XML usa los nombres de las enumeraciones en el WSDL y no el valor.

Si nos fijamos en el WSDL que se verá algo como esto:

<s:simpleType name="QueryType"> 
    <s:restriction base="s:string"> 
    <s:enumeration value="Inquiry" /> 
    <s:enumeration value="Maintainence" /> 
    </s:restriction> 
</s:simpleType> 


Por lo tanto, cuando se invoca el servicio que se espera de una cadena que es el nombre del miembro de la enumeración. Cuando utiliza un proxy .NET, esta conversión generalmente se maneja por usted. Si se pasa un valor al servicio que no se puede deserializar en el valor enum, recibirá el mensaje que está viendo.

Para evitar esto, puede asegurarse de que le está enviando el valor esperado o, si eso no funciona para usted, puede decirle al serializador XML qué valores desea utilizar. Para ello, puede utilizar el atributo XmlEnum:

public enum QueryType 
{ 
    [XmlEnum("1")] 
    Inquiry = 1, 
    [XmlEnum("2")] 
    Maintainence = 2 
} 


Esto generará el siguiente fragmento de esquema (del WSDL):

<s:simpleType name="QueryType"> 
    <s:restriction base="s:string"> 
    <s:enumeration value="1" /> 
    <s:enumeration value="2" /> 
    </s:restriction> 
</s:simpleType> 


Entonces si estás de paso el valor "2" en el servicio, entonces debe deserializarse adecuadamente, pero se pierde el significado de los valores de enumeración.

+0

Lamentablemente, esto tampoco cambió el error que recibí. –

+0

Intentaré publicar una mejor muestra del código con el que estoy trabajando. Quizás es algo extraño lo que estamos haciendo en nuestro DLL y servicio web. –

+0

Sí, proporcione una muestra. –

2

Intente agregar el atributo Flags() a la definición de QueryType.

0

Algo a tener en cuenta es asegurarse de inicializar los valores enum y no asumir que se utilizará el primer elemento de la lista.

Por ejemplo, tener una enumeración definida que no se inicia en el valor entero de 0 como este:

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

Normalmente cuando se declara la instancia de enumeración puede tener la tentación de hacer esto:

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

Si la estructura de datos que devuelve a través del servicio web tiene una variable enumerada adjunta recibirá el error de instancia si se llama desde fuera del servicio web (pero si utiliza la clase de datos desde el servicio web no tendrá errores) .

El punto es, solo asegúrese de haber inicializado correctamente su instancia enum que está volviendo en el servicio web.

+1

si mira hacia atrás en la pregunta original, los valores se estaban inicializando. Una vez que se envió al servicio web, el servicio web ignoraba los valores y utilizaba los nombres enum. –

Cuestiones relacionadas