Question

J'ai une méthode dans un service WCF qui retourne un type complexe (myComplexResult), qui comprend l'un de ses membres une liste (de Common.myBaseClass). Je veux que cette liste pour retenir les objets qui peuvent être de type diversement Foo.myClass1 et Bar.myClass2, tous deux héritant de Common.myBaseClass. Notez que toutes ces classes sont définies dans les différentes assemblées.

Le service lance cette exception:

  

Type   'Foo.myClass1'   avec le nom de contrat de données   'MyClass1: http: // mynamespace / foo / '   n'est pas prévu. Ajoutez tous les types non   connu statiquement à la liste des connus   types - par exemple, en utilisant le   KnownTypeAttribute attribut ou par   en les ajoutant à la liste des types connus   passé à DataContractSerializer.

Bon, alors je me rends compte que je dois déclarer MyClass1 et MaClasse2 que les types connus de MyBaseClass afin que le DataContractSerializer sait quoi faire avec eux. Je ne peux pas faire la chose évidente et décorer la classe MyBaseClass avec KnownType attributs pour MyClass1 et MaClasse2, car cela signifierait l'ajout de références aux assemblées Foo et Bar, ce qui provoque une dépendance circulaire.

J'espérais utiliser declaredTypes dans mon fichier de config et j'ai essayé ceci:

<system.runtime.serialization >
    <dataContractSerializer >
        <declaredTypes >
            <add type ="Common.myBaseClass, Common">
                <knownType type ="Foo.myClass1, Foo" />
                <knownType type ="Bar.myClass2, Bar" />
            </add>
        </declaredTypes>
    </dataContractSerializer>
</system.runtime.serialization>

Cela ne semble pas aider, alors j'ai essayé d'ajouter un attribut KnownType à myComplexResult:

  <DataContract(name:="myComplexResult", [namespace]:="http://mynamespace/coo/")> _
    <KnownType(GetType(Foo.myClass1))> _
    Public Class myComplexResult
        <DataMember(name:="myList")> _
        Public myList As List(Of Common.myBaseClass)

Mais je reçois toujours la même erreur. Aidez-moi! Que dois-je faire?

Était-ce utile?

La solution

Ma faute. J'ai rejugés et les deux solutions que je fais posté ci-dessus fonctionnent réellement. Je pense que cela est un cas de tout simplement pas mettre à jour la référence de service sur mon projet de test avant de lancer le test - oups !!!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top