2009-08-18 11 views
6

he un objeto que tiene un IList genérico en ella que está siendo devuelto a un método de servicio web WCF:WCF IList serialización Edición

[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(); 

Cuando llamo a este método en el servicio que se ejecuta toda la multa método , pero al final arroja un System.ExecutionEngineException sin una InnerException. Intenté devolver un objeto concreto List <> y parece que funciona, pero desafortunadamente necesito encontrar una solución alternativa para devolver un IList. ¿Hay algún atributo que deba poner para resolver esto?

+0

Usted dice "cuando llamo a este método en el servicio" - ¿Es el error realmente al deserializar el resultado? –

+0

Creo que está sucediendo en el lado del servicio cuando se trata de serializar el objeto, ya que sale bien cuando salgo del método de servicio, pero no hay ningún rastro de pila en la excepción, así que no puedo ser positivo. – Nick

Respuesta

1

Vas a tener que añadir atribuyen KnownTypes en la definición de clase por encima de su definición de clase para cada uso de T. De esta manera:


[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(); 

Alternativamente, usted puede definir su propia clase de colección, que tiene una propiedad totalRows , de esta manera:


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

Dónde EntityCollectionWorkaround se define aquí:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1

No creo que puedas hacer esto. ¿Cómo sabrá el serializador a qué desasializar? Muchas cosas podrían implementar un IList, y una interfaz no tiene un constructor.

+0

Parece que funciona bien cuando se usa netTcpBinding, pero no con WSHttpBinding – Nick

+0

¿cuál es el tipo subyacente al que se está deserializando? No veo cómo esto podría funcionar a menos que sea solo al azar escoger un contenedor que implemente IList y los adhiera allí. – Steve

0

Heredar de PageableResults para crear una subclase genérica cerrada, en su caso PageableContentItem o algo así, y usar eso como tipo de devolución. Con los servicios web normalmente se utiliza el serializador xml y necesita saber todo de antemano, es por eso que tampoco puede devolver los tipos de interfaz.

public class PageableContentItem 
     : PageableResults<ContentItem> 
    { 

    } 

[OperationContract] 
PageableContentItem ListCI(); 
Cuestiones relacionadas