2009-08-18 12 views
6

Mam obiekt, który ma rodzajowe IList w nim, który jest zwracany z metody usługi sieci web WCF:WCF IList serializacji Issue

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

Kiedy wywołać tę metodę na służbie to wykonuje całą metodę grzywny , ale na samym końcu generuje wyjątek System.ExecutionEngineException bez wyjątku InnerException. Próbowałem zwrócić konkretny obiekt z listy i wydaje się, że działa, ale niestety muszę znaleźć obejście, które zwróci IList. Czy są jakieś atrybuty, które muszę włożyć, żeby to rozwiązać?

+0

Mówisz "kiedy wywołuję tę metodę w usłudze" - Czy błąd występuje podczas deserializacji wyniku? –

+0

Myślę, że dzieje się to po stronie usługi, gdy przechodzi do serializacji obiektu, ponieważ rzuca się w prawo, gdy wychodzę z metody usługi, ale nie ma śledzenia stosu w wyjątku, więc nie mogę być pozytywny. – Nick

Odpowiedz

1

Musisz dodać atrybut KnownTypes na definicji klasy powyżej definicji klasy dla każdego użycia T. tak:


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

Alternatywnie można zdefiniować własną klasę zbiór, który ma właściwość TotalRows coś takiego:


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

Gdzie EntityCollectionWorkaround zdefiniowany jest tutaj:
http://borismod.blogspot.com/2009/06/v2-wcf-collectiondatacontract-and.html

1

Nie sądzę, że możesz to zrobić. W jaki sposób serializer będzie wiedział, do czego można się pozbyć? Wiele rzeczy może implementować IList, a interfejs nie ma konstruktora.

+0

Wydaje się, że działa dobrze podczas używania netTcpBinding, ale nie z WSHttpBinding – Nick

+0

jaki jest podstawowy typ, do którego to przekształca się z postaci szeregowej? Nie widzę, jak to działa, chyba że jest to po prostu losowe wybieranie kontenera, który implementuje IList i umieszcza je tam. – Steve

0

Dziedzicz z PageableResults, aby utworzyć zamkniętą podklasę generyczną, w swoim przypadku PageableReadItem lub coś podobnego, i użyj tego jako typu zwracanego. W przypadku usług sieciowych zwykle używa się serializatora xml i musi on wiedzieć wszystko z góry, dlatego nie można zwrócić również typów interfejsu.

public class PageableContentItem 
     : PageableResults<ContentItem> 
    { 

    } 

[OperationContract] 
PageableContentItem ListCI();