Oggi dovevo recuperare una lista di lotti dal DB passando per un servizio WCF residente sul web server per consentirmi di mettere la parte di accesso ai dati più “vicina” alla base dati stessa.
Dato che mi servivano parecchie proprietà (anche collegate a classi lungo l’albero di navigazione delle classi stesse).
La chiamata mi tornava un System.ServiceModel.ComunicationException con un messaggio di questo genere:
Errore durante la ricezione della risposta HTTP a http://*****/QueryHelper.svc. È possibile che il binding dell'endpoint del servizio non utilizzi il protocollo HTTP o che un contesto di richiesta HTTP sia stato interrotto dal server (probabilmente a causa dell'arresto del server). Per ulteriori informazioni, vedere i registri del server.
In un primo momento ho pensato ad un errore nella routine del servizio… ma il debug mi confermava che nella routine tutto era a posto…
Navigando ho trovato un articolo che indicava che un errore di questo genere deriva dal fatto che qualcosa non risulta serializzabile e per trovarlo suggeriva di usare una routine di test di questo tipo:
Public Shared Sub LogDTO(Of TDTO)(ByVal dto As TDTO)
Dim ser As New System.Runtime.Serialization.DataContractSerializer(GetType(TDTO))
Dim writer As New IO.FileStream("C:\temp\" + dto.[GetType]().Name + ".xml", IO.FileMode.Create)
ser.WriteObject(writer, dto)
writer.Close()
End Sub
In questo modo ho scoperto che il problema era nella serializzazione delle classi proxy generate da NHibernate.
Aggiunta questa ruotine alla mia cassetta degli attrezzi per futuri problemi di serializzazione … sono passato all’utilizzo di un DTO per dare una veloce soluzione al problema.
Ma il dubbio mi è rimasto e stasera ho trovato un post esaustivo sull’argomento: Remoting Using WCF and NHibernate. Me lo studierò per bene.. ma mi sa che i DTO siano più maneggevoli
Che EF risolva il problema?