2011-02-03 14 views
8

He creado un servicio WCF que devuelve IEnumerable<CyberResourceProvisioningAction>.WCF: decorar IEnumerable <T> con DataMember produce Excepción: la conexión subyacente se cerró: la conexión se cerró inesperadamente

El tipo CyberResourceProvisioningAction tiene una propiedad de AccountInformation IEnumerable<CyberResourceProvisioningActionAccountInfo>. Cuando decorar la propiedad AccountInformation con DataMemberAttribute recibo la excepción:

WCF System.NET.WebException: La conexión subyacente se cerró : La conexión se cerró inesperadamente

Obviamente una excepción muy genérico , pero mi Google-fu indica que el problema ocurre con mayor frecuencia al devolver grandes cantidades de objetos en una colección. La solución sugerida es establecer el <dataContractSerializer maxItemsInObjectGraph="2147483646"/>. Lamentablemente, esto no ha solucionado mi problema. (No pensé que sería, ya que estoy devolviendo una pequeña cantidad de datos).

Las propiedades se están configurando correctamente, así que estoy bastante seguro de que mi problema tiene que ver con mi configuración de serialización. ¿Hay algo mal con mis clases que esté causando el error del servicio WCF de esta manera?

[DataContract] 
public class CyberResourceProvisioningAction 
{ 
    [DataMember] 
    public string Action { get; set; } 

    [DataMember] 
    public DateTime RcdChgDateTime { get; set; } 

    [DataMember] 
    public string CyberResourceName { get; set; } 

    [DataMember] 
    public IEnumerable<CyberResourceProvisioningActionAccountInfo> AccountInformation 
    { get; set; } 
} 

CyberResourceProvisioningActionAccountInfo

[DataContract] 
public class CyberResourceProvisioningActionAccountInfo 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Value { get; set; } 
} 

Si se requiere información adicional de configuración hágamelo saber y voy a editar el cargo.

+2

si tiene habilitada la página de ayuda, navegue hasta la misma para ver si está recibiendo una excepción de activación; de lo contrario, adjunte un depurador y excepciones de trampa. Parece que podría ser una violación del modelo de programación de DataContract. – alexdej

+0

@alexdej Adjunté un depurador pero nunca atrapo ninguna excepción. La excepción aparece en WCF Test Client, pero no en mi depurador. – ahsteele

+1

Intente depurar directamente su proyecto de host WCF y pruebe su servicio con el 'WcfTestClient' –

Respuesta

14

Debido al comentario sobre "violación del modelo de programación DataContract" dejado por alexdej empecé a mirar un poco más de cerca lo que había en mis propiedades. Tenía un tipo Linq en la propiedad y, aunque era un IEnumerable, no estaba enumerado para la serialización. Se agregó .ToList() y todo está bien.

+1

que recibo de mi Servicio después del error' Tipo 'System.Data.Entity.Infrastructure.DbQuery1 [MYCLASS]' no se puede serializar. Considere marcarlo con el atributo DataContractAttribute y marcar todos sus miembros que desee serializar con el atributo DataMemberAttribute. Si el tipo es una colección, considere marcarlo con CollectionDataContractAttribute. Consulte la documentación de Microsoft .NET Framework para otros tipos admitidos. Al agregar '.ToList()' antes de la declaración de retorno, soluciono mi problema. ¡Gracias! – MaciejLisCK

+0

@MaciejLisCK me alegro de que esto haya funcionado para usted. – ahsteele

Cuestiones relacionadas