2009-08-03 7 views
5

J'ai un service WCF où j'essaye de retourner une liste (où IWatchable est une interface faite sur commande que j'ai construite) dans un de mes contrats d'opération. Lorsque je teste le service sur le client, la méthode renvoie un object[] au lieu de List<IWatchable>. Est-il possible de retourner une liste d'IWatchable, puisque IWatchable est une interface avec WCF?Comment puis-je passer une liste <Interface> sur WCF?

Méthode:

public List<IWatchable> GetWorkload(Guid nodeId, int maximum) 

IWatchable:

public interface IWatchable 
{ 
    string ActionName { get; set; } 
    Guid ActionReference { get; set; } 
} 

Il faut espérer un peu plus d'informations sera utile ...

J'ai une interface dérivée:

public interface IAMRAWatchable: IWatchable 

Et trois concre implémentations te de IAMRAWatchable:

public class InstrumentationWatch: IAMRAWatchable 
public class OutputWatch: IAMRAWatchable 
etc... 

Dans ma méthode WCF qui retourne List<IWatchable> Je veux envoyer un InstrumentationWatch et un OutputWatch au client ... Est-ce possible ou que je vais sur ce dans le mauvais sens?


Résolue

Merci à John que j'ai trouvé ma solution. KnownType ne fonctionnait pas depuis que j'utilisais List<IWatchable> - J'ai donc enveloppé ma liste dans une nouvelle classe et lui ai ajouté les attributs. Je vais avoir besoin de re-facteur mon code, mais pour d'autres qui sont intéressés ici est la classe:

[DataContract] 
[KnownType(typeof(InstrumentationWatch))] 
[KnownType(typeof(OutputWatch))] 
public class WorkInfo 
{ 
    [DataMember] 
    public List<IWatchable> WorkQueue { get; set; } 
} 

et ma méthode WCF:

public WorkInfo GetWorkload(Guid nodeId, int maximum) 
+0

Comment avez-vous créé votre client (à partir de zéro/svcutil/Add Service Reference)? –

+0

J'ai essayé les deux avec le même résultat – DennyFerra

+0

Que diriez-vous de nous montrer comment vous avez implémenté l'attribut KnownTypes? –

Répondre

9

Une interface ne peut jamais être sérialisé. Ce n'est qu'une description du comportement.

Vous pouvez sérialiser des objets qui implémentent l'interface, mais vous devez indiquer à WCF quels sont leurs types. Voir Data Contract Known Types.

+0

J'ai essayé les attributs KnownType mais je n'ai toujours pas réussi à contourner mon problème. Peut-être que l'information supplémentaire que j'ai fournie aidera à éclaircir mon problème exact. Merci – DennyFerra

Questions connexes