2010-01-18 1 views
7

Ho una classe astratta chiamata 'Template' definito come:Una connessione esistente veniva chiusa forzatamente dall'host remoto in WCF

[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; }   
} 

Due classi derivate: UserTemplate e SystemTemplate implementa sopra classe astratta, definite come :

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; 
    } 
} 

Ora, quando provo a chiamare seguente metodo di servizio:

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

Ho ricevuto questo errore:

System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

È per la ragione che sto cercando di restituire una classe astratta?
Funziona correttamente se provo a chiamare questo metodo usando unit test.

risposta

3

Oltre alla risposta di granata di fare quelle classi discendenti noti per WCF usign l'attributo KnownType (o ServiceKnownType), dovrete anche per decorare le classi discendenti con [DataContract] attributo se stessi.

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

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

Questi attributi sono quasi mai ereditate dai genitori ai figli in WCF - è necessario essere molto esplicito e chiaro circa il vostro intento ad ogni livello.

Controllare questo post del blog All About KnownTypes per ulteriori informazioni sugli attributi KnownTypes e ServiceKnownTypes.

0

aggiungere questa riga DataContractSerializer nel vostro web file di configurazione

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

ho ottenuto questo errore una volta, ed era piuttosto confusa. Il mio problema era che il servizio di riferimento era per qualche motivo non aggiornato, quindi l'aggiornamento del riferimento ai servizi ha aiutato.