2009-11-11 4 views
0



Je développe des services WCF dans le cadre NET 3.5 et les fenêtres d'hébergement dans IIS 5.1 xp sp3 avec basicHttpBiding.

Services consommant le client développé dans .net 2.0 framework. Pour cela, j'ai généré un client proxy en utilisant WSDL.EXE. Cet outil génère une classe proxy sans aucun problème, mais le problème qu'il ajoute pour chaque propriété ajoute une propriété supplémentaire "[propriété] Spécifié", mais cela fonctionne correctement sans problème, seulement besoin de spécifier "specified = true" lors de l'affectation valeur à toute propriété

Pour supprimer cette propriété supplémentaire, j'ai ajouté XmlSerializerFormat attribué avec l'attribut ServiceContract. WSDL.EXE génère la classe sans propriété supplémentaire, mais elle exclut certaines classes qui sont incluses précédemment.

Y a-t-il des propriétés que je dois définir pour générer les classes exclues?

Remarque: Toutes les classes de contrat sont attribuées avec DataContract et les propriétés avec DataMemeber.


NRKWCF client proxy généré avec wsdl ne correspondant pas à ServiceContract, XmlSerializerFormat attribue

Répondre

3

XmlSerializer utilise XmlIncludeAttribute au lieu de KnownTypeAttribute pour découvrir les types enfants qui ne sont pas inclus dans les contrats d'exploitation. Vous pouvez donc essayer de les ajouter à la classe de base:

+0

Merci Darin, je l'ai fait comme tu l'as spécifié, ça marche. :) – nRk

1

La norme WCF DataContractSerializer sérialise tout marqué par [DataMember] - quelle que soit la visibilité .NET (public/protégé/privé/interne). Lorsque vous passez à XmlSerializerFormat, le comportement change: désormais, XmlSerializer sérialise tout ce qui a une visibilité public et ne porte pas de [XmlIgnore] marqué dessus.

Je suppose que certaines de vos classes et membres ne sont pas marqués public et ne sont plus numérotés. Le XmlSerializer requiert également que les classes aient un constructeur explicite, sans paramètre, qui sera utilisé dans la désérialisation - toutes vos classes ont-elles cela? Et bien sûr, ce constructeur doit également être public.

+0

Merci Marc, Comme vous l'avez indiqué, toutes les propriétés ont un constructeur public et un constructeur par défaut. Le problème vient, où j'ai besoin de retourner à une méthode est la classe de base, qui est héritée par 8 classes enfants, mais je reçois en proxy seulement 4 classes. Toutes les classes héritées ont un constructeur public/par défaut et toutes les propriétés sont publiques. Toutes les classes sont décorées avec DataContract et les propriétés avec DataMember attrigute. – nRk

+0

Les attributs DataContract/DataMember importent peu ici si vous utilisez XmlSerializer. Toutes vos 8 classes enfants sont-elles définies quelque part dans un attribut [KnownType] sur un contrat d'opération? Je pense que seuls ceux qui sont mentionnés spécifiquement soit comme un paramètre dans une opération, ou au moyen de l'attribut de type connu, seront sérialisés –

+0

Merci pour l'aide. Désolé, j'ai oublié de mentionner que, dans la classe de base j'ai ajouté l'attribut [KnownType (typeof (childclass))], j'ai ajouté 8 attributs pour chaque classe enfant. – nRk

Questions connexes