2009-09-30 19 views
6

¿Cómo se puede hacer que WCF use xs: All en lugar de xs: Sequence cuando define tipos de objetos complejos en wsdl/xsd para un servicio web?¿Cómo se puede forzar a WCF a usar xs: All en lugar de xs: Secuencia para que el orden de los elementos SOAP sea irrelevante?

El problema que estoy teniendo es que xs: Sequence requiere que las aplicaciones que llaman pasen los elementos en el mensaje soap en el orden especificado en el WCF generado xsd (esto es alfabético por defecto). xs: a todos (o elección en ese caso) no les importa el orden.

¿Se puede cambiar este comportamiento simplemente a través de una opción de configuración en alguna parte?

+0

Puedes escribir tu propia extensión para crear el WSDL si realmente quieres, no es totalmente trivial, pero se puede hacer. Busque en la web la "extensión WCF WSDL": debería haber bastantes muestras por ahí –

Respuesta

3

Desde lo alto de mi cabeza, creo que no se puede. Lo que puede hacer en su lugar, es escribir el archivo WSDL a mano, luego use svcutil.exe para generar el código.

Si todo lo que desea hacer es ordenar elementos en un orden diferente que alfabéticamente, puede ordenar los elementos en el DataContract, usando el parámetro Order (comenzando en 1, no como matrices) en el atributo [DataMember] ([DataMember (Order = 1)], [DataMember (Order = 2)], etc.).

+1

+1 que tiene clavadas en la cabeza - no hay forma de salir de la caja para ordenar a WCF que use xs: todas en lugar de xs: secuencia –

+0

Por una vez que tengo el tiempo para responder una pregunta WCF más rápido que tú :) – Philippe

+0

Gracias, pensé que este podría haber sido el caso. –

0

Incluso si pudiera forzar a WCF a hacerlo, el deserializador no funcionaría correctamente para admitir la entrada. Ejemplos y explicación a continuación.

Entrada 1 (buena):

<MyOperation> 
    <AField>value A</AField> 
    <BField>value B</BField> 
</MyOperation> 

Entrada 2 (malo):

<MyOperation> 
    <BField>value B</BField> 
    <AField>value A</AField> 
</MyOperation> 

lo tanto, si la entrada 1 deserializar correctamente, entonces no habría la entrada 2 - BField tendría un valor que fue establecido, pero la propiedad AField sería nula.

Si WCF no puede manejar esta entrada fuera de secuencia, creo firmemente que debería arrojar una excepción, pero en función de mi prueba (.NET 3.5 en IIS) no lo hace, simplemente omite algunos valores de elementos .

Además, WCF también ignora la entrada totalmente falsa, siempre que no afecte a los valores válidos de los elementos que está buscando. Así que esta entrada

<MyOperation> 
    <bogusField>with or without data</bogusField> 
    <AField>value A</AField> 
    <bogusField2 /> 
    <BField>value B</BField> 
    <bogusField3></bogusField3> 
</MyOperation> 

no tiraría los errores, y en realidad deserializar los valores de lejos y BField.

Cuestiones relacionadas