Déclaration de types connus pour les contrats de données dans différents ensembles
-
13-09-2019 - |
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?
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 !!!