2016-05-24 13 views
0

Ich habe meinen WCF-Dienst, der Daten sowohl im XML- als auch im JSON-Format zurückgibt.Zurückgeben einer Liste <object> in WCF

Ein Functios muss eine Liste zurückgeben, weil ich nicht weiß, welche Klasse verwendet wird, um diese Liste zu füllen.

Also, ich habe meine Klasse:

public class WrapHome 
{ 
    public WrapHome() { } 

    private string p_TITOLO { get; set; } 
    public string TITOLO { get { return p_TITOLO.ToString(); } set { p_TITOLO = value; } } 

    private List<object> p_CHART { get; set; } 
    public List<object> CHART { get { return p_CHART; } set { p_CHART = value; } } 
} 

und meine WCF-Deklaration:

[OperationContract] 
[WebGet(UriTemplate = "datiHome.xml?token={token}&p1={p1}&p2={p2}", ResponseFormat = WebMessageFormat.Xml)] 
List<WrapHome> GetDatiHomeXML(string token, string p1, string p2); 

Der Ausgang richtig eingestellt ist, aber, wenn sie es in XML konvertiert zurückzukehren (oder JSON), ruft es die Methode erneut auf und gibt schließlich den Fehler err_connection_reset aus.

Ich weiß, das Problem ist die Liste, denn wenn ich es kommentiere, funktioniert es. Wie kann ich meine Liste in meiner WCF-Ausgabe verwenden?

Wenn Sie weitere Informationen benötigen, fragen Sie mich ohne Probleme.

+0

Sie können alle möglichen Arten enumarate, die schließlich in der Liste sein, nicht wahr? –

+0

@rudolf_franek gut, ich denke ja, die möglichen Typen sind insgesamt 5 oder 6, also ja. Warum? –

+0

Sie könnten einen Basistyp für Ihre Objekte definieren, die in List platziert werden sollen - dieses Objekt kann mit KnownTypeAttribute markiert werden - wobei alle Typen als Parameter aufgelistet werden. - oder die KnownTypes können auf der Ebene des Service/Contract –

Antwort

1

Sie könnten

[KnownType(typeof(MyChildObject0))] 
... 
[KnownType(typeof(MyChildObjectM))] 
public class MyBaseObject { ... } 

public class MyChildObject0 : MyBaseObject { ... } 
... 
public class MyChildObjectM : MyBaseObject { ... } 

definieren Oder Sie könnten das Attribut nur einmal und definieren statische Methode, die alle M + 1 Typen auf einmal wieder hinzufügen.

und ändern:

public class WrapHome 
{ 
    ... 
    public List<MyBaseObject> CHART { get;set; } 
} 
+0

Jetzt bekomme ich vor der Kompilierung einen Konvertierungsfehler: var temp = new Liste (); temp.Add (neue TortaTipoPagE ("aaa", "1111")); temp.Add (neues TortaTipoPagE ("bbb", "2222")); var tt = neu WrapHome() {}; tt.TITOLO = "prova"; tt.CHART = temp; r.Add (tt); was mache ich falsch? –

+1

Sie müssen TortaTipoPagE erben: MyBaseObject –

+0

Wunderbar !! Es funktioniert, danke Mann !!!! –