2009-08-18 24 views
6

Ho un oggetto che ha un IList generico in esso che viene restituito da un metodo di servizio Web WCF:WCF IList serializzazione Problema

[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults<ContentItem> ListCI(); 

Quando chiamo questo metodo sul servizio che esegue il metodo tutto il bene , ma alla fine getta un'eccezione System.ExecutionEngineException senza InnerException. Ho provato a restituire un oggetto List <> concreto e sembra funzionare, ma sfortunatamente ho bisogno di trovare una soluzione alternativa per restituire un IList. Ci sono degli attributi che devo inserire per risolvere questo?

+0

Si dice "quando chiamo questo metodo sul servizio" - L'errore si verifica effettivamente quando deserializza il risultato? –

+0

Penso che stia accadendo nel lato del servizio quando va a serializzare l'oggetto poiché getta a destra mentre esco dal metodo di servizio, ma non c'è traccia dello stack nell'eccezione, quindi non posso essere positivo. – Nick

risposta

1

Dovrete aggiungere attribuiscono KnownTypes sulla definizione di classe sopra la definizione di classe per ogni utilizzo di T. Come questo:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> 
{ 
    [DataMember] 
    public IList<T> Items { get; set; } 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

[OperationContract] 
PageableResults ListCI(); 

In alternativa, è possibile definire la propria classe di raccolta, che ha una proprietà TotalRows , in questo modo:


[KnownType(typeof(ContentItem))] 
[DataContract(Name = "PageableList_Of_{0}")] 
public class PageableResults<T> : EntityCollectionWorkaround<T> 
{ 
    [DataMember] 
    public int TotalRows { get; set; } 
} 

Dove EntityCollectionWorkaround è definito qui:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1

Non penso che tu possa farlo. In che modo il serializzatore saprà a cosa fare per la scansione? Molte cose potrebbero implementare un IList e un'interfaccia non ha un costruttore.

+0

Sembra funzionare bene quando si utilizza netTcpBinding, ma non con WSHttpBinding – Nick

+0

qual è il tipo sottostante a cui si sta deserializzando? Non vedo come questo potrebbe funzionare a meno che non si scelga in modo casuale un container che implementa IList e li attacchi lì. – Steve

0

Eredita da PageableResults per creare una sottoclasse generica chiusa, nel tuo caso PageableContentItem o qualcosa del genere, e usarla come tipo restituito. Con webservices normalmente viene utilizzato il serializzatore xml e deve sapere tutto in anticipo, ecco perché non è possibile restituire anche i tipi di interfaccia.

public class PageableContentItem 
     : PageableResults<ContentItem> 
    { 

    } 

[OperationContract] 
PageableContentItem ListCI(); 
Problemi correlati