2010-01-18 6 views
7

Ich habe eine abstrakte Klasse namens ‚Vorlage‘ gewaltsam geschlossen:Eine bestehende Verbindung wurde von der Remote-Host in WCF definiert als

[DataContract] 
public abstract class Template 
{ 
    [DataMember] 
    public virtual int? Id { get; set; } 
    [DataMember] 
    public virtual string Title { get; set; } 
    [DataMember] 
    public virtual byte[] TemplateDoc { get; set; } 
    [DataMember] 
    public virtual bool IsSystemTemplate { get; set; }   
} 

zwei abgeleiteten Klassen: UserTemplate und SystemTemplate implementiert über abstrakte Klasse, die wie folgt definiert ist :

public class UserTemplate : Template 
{ 
    [DataMember] 
    public virtual Int32? OfficeId { get; set; } 

    [DataMember] 
    public virtual Int32? UserId { get; set; } 

    protected UserTemplate() { } 

    public UserTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int officeId, int? userId) 
    { 
     this.Title = title; 
     this.TemplateDoc = templateDoc; 
     this.IsSystemTemplate = false; 
     this.OfficeId = officeId; 
     this.UserId = userId; 
    } 
} 

public class SystemTemplate : Template 
{ 
    [DataMember] 
    public virtual Int32? MultiListGroupId { get; set; } 

    protected SystemTemplate() { } 

    public SystemTemplate(string title, byte[] templateDoc, string templateDocName, TemplateType templateType, int multiListGroupId) 
    { 
     this.Title = title; 
     this.TemplateDoc = templateDoc; 
     this.IsSystemTemplate = true; 
     this.MultiListGroupId = multiListGroupId; 
    } 
} 

Jetzt, wenn ich versuche, folgende Service-Methode aufzurufen:

List<Template> GetTemplatesByTemplateType(int officeId, int? userId, TemplateType templateType) 

Ich erhalte diesen Fehler:

Ist es wegen des Grundes, dass ich versuche, eine abstrakte Klasse zurückzugeben?
Es läuft gut, wenn ich versuche, diese Methode mit Komponententest aufzurufen.

Antwort

3

Neben Granate Antwort über diese abgeleiteten Klassen bekannt WCF machen usign die KnownType (oder ServiceKnownType) Attribut, werden Sie auch die abgeleiteten Klassen mit einem [DataContract] Attribut selbst dekorieren müssen.

[DataContract] 
public class UserTemplate : Template 
{ 
    ...... 
} 

[DataContract] 
public class SystemTemplate : Template 
{ 
    ...... 
} 

Diese Attribute werden so gut wie nie von den Eltern auf das Kind in WCF geerbt - Sie müssen auf allen Ebenen sehr deutlich und klar über Ihre Absicht sein.

In diesem Blogpost All About KnownTypes finden Sie weitere Informationen zu den Attributen KnownTypes und ServiceKnownTypes.

0

Fügen Sie diese DataContractSerializer Zeile in Ihrer Web-Konfigurationsdatei

<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior > 
     **<dataContractSerializer maxItemsInObjectGraph="2147483646"/>** 
    </behavior > 
</serviceBehaviors> 
</behaviors> 
</system.serviceModel> 
0

ich einmal diesen Fehler bekam, und es war ziemlich verwirrend. Mein Problem war, dass die Service-Referenz aus irgendeinem Grund nicht auf dem neuesten Stand war, daher half das Aktualisieren der Service-Referenz.

Verwandte Themen