2009-09-30 4 views
6

Comment pouvez-vous utiliser WCF xs: All au lieu de xs: Sequence lorsqu'il définit des types d'objets complexes dans le fichier wsdl/xsd pour un service Web? Le problème que je rencontre est que xs: Sequence exige que les applications appelantes transmettent les éléments dans le message soap dans l'ordre spécifié dans le fichier xsd généré par WCF (c'est alphabétique par défaut). xs: Tout (ou le choix d'ailleurs) ne se soucie pas de la commande.Comment forcer WCF à utiliser xs: All au lieu de xs: Sequence pour que l'ordre des éléments SOAP ne soit pas pertinent?

Ce comportement peut-il être modifié simplement via une option de configuration quelque part?

+0

Vous pouvez écrire votre propre extension pour créer le WSDL si vous le voulez vraiment - ce n'est pas totalement trivial, mais cela peut être fait. Recherche sur le Web pour "WCF WSDL extension" - il devrait y avoir quelques échantillons là-bas –

Répondre

3

Du haut de ma tête, je pense que vous ne pouvez pas. Ce que vous pouvez faire à la place, c'est écrire le fichier WSDL à la main, puis utiliser svcutil.exe pour générer le code. Si tout ce que vous voulez faire est de commander des éléments dans un ordre différent de l'ordre alphabétique, vous pouvez commander les éléments dans le DataContract, en utilisant le paramètre Order (commençant par 1, non 0 like arrays) sur l'attribut [DataMember] [DataMember (Order = 1)], [DataMember (Order = 2)], etc).

+1

+1 vous avez cloué sur la tête - il n'y a aucun moyen de sortir de la boîte pour instruire WCF d'utiliser xs: tout au lieu de xs: séquence –

+0

Pour une fois que j'ai le temps de répondre à une question WCF plus rapidement que vous faites :) – Philippe

+0

Merci, je pensais que cela pouvait être le cas. –

0

Même si vous pouviez forcer WCF à le faire, le désérialiseur ne fonctionnerait pas correctement pour supporter l'entrée. Exemples et explication ci-dessous.

Entrée 1 (bon):

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

Entrée 2 (mauvais):

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

Donc, si l'entrée 1 désérialisée correctement, entrée 2 ne serait pas - BField aurait une valeur était défini, mais la propriété AField serait nulle. Si WCF ne peut pas gérer cette entrée hors séquence, je pense fortement qu'il devrait lancer une exception, mais en fonction de mes tests (.NET 3.5 dans IIS), il ne le fait pas, il ignore certaines valeurs d'élément . Par ailleurs, WCF ignore également les entrées totalement fausses, tant qu'elles n'affectent pas les valeurs d'éléments valides recherchées. Donc, cette entrée

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

ne jeter aucune erreur, et serait en fait désérialiser les valeurs et LOIN BField.

Questions connexes