2009-06-11 6 views
2

J'ai une méthode dans un service WCF qui retourne un type complexe (myComplexResult), qui inclut comme un de ses membres une liste (Of Common.MyBaseClass). Je souhaite que cette liste contienne des éléments qui peuvent être de type Foo.myClass1 et Bar.myClass2, tous deux héritant de Common.myBaseClass. Notez que toutes ces classes sont définies dans différents assemblys.Déclaration des types connus pour les contrats de données dans différents assemblages

Le service génère cette exception:

type 'Foo.myClass1' avec le nom de contrat de données 'MyClass1: http://mynamespace/foo/' ne devrait pas. Ajoutez tous les types non connus statiquement à la liste des types connus - par exemple, en utilisant l'attribut KnownTypeAttribute ou par en les ajoutant à la liste des types connus passés à 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 les attributs KnownType pour myClass1 et myClass2, car cela signifierait ajouter des références aux assemblys 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 fais-je?

Répondre

3

Ma faute. J'ai réessayé et les deux solutions que j'ai affichées ci-dessus fonctionnent. Je pense que c'est un cas de ne pas simplement mettre à jour la référence de service sur mon projet de test avant de lancer le test - whoops !!!

Questions connexes