2009-08-03 4 views
5

Ho un servizio WCF in cui sto cercando di restituire un elenco (in cui IWatchchable è un'interfaccia personalizzata che ho creato) in uno dei miei contratti operativi. Quando eseguo il test del servizio sul client, il metodo restituisce un valore object[] anziché List<IWatchable>. È possibile restituire una lista di IWatchable, dato che IWatchable è un'interfaccia con WCF?Come posso passare una lista <Interface> su WCF?

Metodo:

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

IWatchable:

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

Speriamo che un po 'più di informazioni sarà utile ...

Ho un'interfaccia derivata:

public interface IAMRAWatchable: IWatchable 

E tre concre te le implementazioni da IAMRAWatchable:

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

Nel mio metodo WCF che restituisce List<IWatchable> Voglio inviare una InstrumentationWatch ed un OutputWatch al cliente ... Questo è possibile o sto andando su questo nel modo sbagliato?


risolto

Grazie a John che ho trovato la mia soluzione. KnownType non funzionava da quando stavo usando List<IWatchable> - Così ho avvolto la mia lista in una nuova classe e ho aggiunto gli attributi ad essa. Avrò bisogno di ri-factor il mio codice ma per gli altri che sono interessati qui è la classe:

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

e il mio metodo WCF:

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

Come è stato creato il client (da zero/svcutil/Aggiungi riferimento servizio)? –

+0

Ho provato entrambi con lo stesso risultato – DennyFerra

+0

Che ne dici di mostrarci come hai implementato l'attributo KnownTypes? –

risposta

9

Un'interfaccia può mai essere serializzato. È solo una descrizione del comportamento.

È possibile serializzare oggetti che implementano l'interfaccia, ma è necessario indicare a WCF quali sono i tipi. Vedi Data Contract Known Types.

+0

Ho provato gli attributi di KnownType ma non sono riuscito a risolvere il problema. Forse le informazioni extra che ho fornito aiuteranno a chiarire il mio problema esatto. Grazie – DennyFerra