2011-02-03 20 views
8

Ho creato un servizio WCF che restituisce IEnumerable<CyberResourceProvisioningAction>.WCF - Decorazione IEnumerable <T> con DataMember causa Eccezione: la connessione sottostante è stata chiusa: la connessione è stata chiusa in modo imprevisto

Il tipo CyberResourceProvisioningAction ha una proprietà di AccountInformation IEnumerable<CyberResourceProvisioningActionAccountInfo>. Quando I decorare la proprietà AccountInformation con DataMemberAttribute ricevo eccezione:

WCF System.Net.WebException: La connessione sottostante chiusa: La connessione stata chiusa inaspettatamente

Ovviamente un'eccezione molto generico , ma il mio Google-fu indica che il problema si verifica più comunemente quando si restituisce un numero elevato di oggetti in una raccolta. La soluzione suggerita è impostare <dataContractSerializer maxItemsInObjectGraph="2147483646"/>. Purtroppo questo non ha risolto il mio problema. (Non pensavo che sarebbe come sto restituendo una piccola quantità di dati).

Le proprietà sono impostate correttamente, quindi sono abbastanza sicuro che il mio problema abbia a che fare con la mia configurazione di serializzazione. C'è qualcosa di sbagliato nelle mie classi che sta causando errori del servizio WCF in questo modo?

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

Se è necessario ulteriori informazioni sulla configurazione fatemelo sapere e io modificare il post.

+2

se hai abilitato la pagina della guida, naviga per vedere se ricevi un'eccezione di attivazione; altrimenti, allega un debugger e intercetta le eccezioni. Sembra che potrebbe essere una violazione del modello di programmazione DataContract. – alexdej

+0

@alexdej Ho allegato un debugger ma non ho mai intrappolato alcuna eccezione. L'eccezione si presenta nel client di test WCF ma non nel mio debugger. – ahsteele

+1

Prova a eseguire il debug del tuo progetto host WCF direttamente e prova il tuo servizio con il 'WcfTestClient' –

risposta

14

A causa del commento su "violazione del modello di programmazione DataContract" lasciato da alexdej ho iniziato a guardare un po 'più vicino a ciò che era nelle mie proprietà. Avevo un tipo Linq nella proprietà e sebbene fosse un oggetto IEnumerable non veniva enumerato per la serializzazione. Aggiunto uno .ToList() e tutto va bene.

+1

Ricevo dal mio servizio dopo l'errore' Tipo 'System.Data.Entity.Infrastructure.DbQuery1 [MYCLASS]' non può essere serializzato. Considera di contrassegnarlo con l'attributo DataContractAttribute e contrassegnare tutti i membri che desideri serializzati con l'attributo DataMemberAttribute. Se il tipo è una raccolta, prendere in considerazione la possibilità di contrassegnarla con CollectionDataContractAttribute. Consultare la documentazione di Microsoft .NET Framework per altri tipi supportati. Aggiungere '.ToList()' prima che la dichiarazione di ritorno risolva il mio problema. Grazie! – MaciejLisCK

+0

@MaciejLisCK felice che questo abbia funzionato per te. – ahsteele

Problemi correlati