2010-01-18 13 views
7

tengo una clase abstracta llamada definido 'Plantilla' como:una conexión existente forzosamente fue cerrada por el host remoto en 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; }   
} 

Dos clases derivadas: UserTemplate y SystemTemplate implementa encima de clase abstracta, que se definen como :

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

Ahora, cuando intento llamar método siguiente servicio:

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

Recibo este error:

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

¿Es por la razón por la que intento devolver una clase abstracta?
Funciona bien si trato de llamar a este método usando la prueba unitaria.

Respuesta

3

Además de la respuesta de granada sobre la fabricación de esas clases descendientes conocidos por WCF usign el atributo KnownType (o ServiceKnownType), también tiene que decorar las clases descendientes con un [DataContract] atribuir a sí mismos.

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

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

Estos atributos casi nunca se heredan de padres a hijos en WCF - tiene que ser muy explícito y claro acerca de su intención en todos los niveles.

Consulte esta publicación en el blog All About KnownTypes para obtener más información sobre los atributos KnownTypes y ServiceKnownTypes.

0

añadir esta línea DataContractSerializer en su archivo web.config

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

Tengo este error una vez, y fue muy confuso. Mi problema era que, por alguna razón, la Referencia del servicio no estaba actualizada, por lo que fue útil actualizar la Referencia del servicio.

Cuestiones relacionadas