Ciao Marco
Ho provato ad inserire il debug sia nel lato Service, sia nel lato Client
Per quanto riguarda il Service (WCF), procede tutto regolare senza eccezioni, il messaggio viene serializzato correttamente e non ci sono problemi
Il problema si verifica invece quando il Client cerca di deserializzare il messaggio Putroppo daltrace log non evince nulla di nuovo, soltanto il solito errore:
Eccezione generata dal formattatore nel tentativo di deserializzare il messaggio: Errore durante il tentativo di deserializzare il parametro http://tempuriorg/:ListaElementiResult Messaggio InnerException: 'Il numero massimo di elementi che possono essere serializzati o deserializzati in un oggetto grafico è '65536' Modificare l'oggetto grafico o incrementare la quota MaxItemsInObjectGraph ' Per ulteriori dettagli, vedere InnerException
Ora, questo messaggio di errore, in questo caso è alquanto fuorviante, poichè (tralasciando che l'attributo MaxItemsInObjectGraph è già impostato al valore massimo) il problema dovrebbe verificarsi sempre, e cioè:
se io invio sul canale 50 elementi, o ce ne sono 50 o 100 e 500 sul database, se il problema fosse che non posso serializzarne/deserializzarne 50, dovrebbe darmelo sempre, e non soltanto quando sul database ce ne sono 500
Ora, se può essere importante, la procedura che eseguo per restituire i dati paginati è questa:
public List<Elementi> ListaElementi(int pagina, int elementi)
{
var lista = _contextElementoSetWhere(p => pFase == 0)OrderByDescending(p => pData)ToList();
var result = listaPage(pagina, elementi);
return result;
}
dove il metodo Page è un metodo di estenzione che esegue la paginazione:
public static class PagingExtensions
{
public static IQueryable<TSource> Page<TSource>(this IQueryable<TSource> source, int pagina, int elementi)
{
return elementi > 0 ? sourceSkip((pagina - 1) * elementi)Take(elementi) : source;
}
public static IEnumerable<TSource> Page<TSource>(this IEnumerable<TSource> source, int pagina, int elementi)
{
return elementi > 0 ? sourceSkip((pagina - 1) * elementi)Take(elementi) : source;
}
}
Mettendo un punto di interruzione sul return, result è sempre di 50 elementi, ma se sul database ci sono più di 500 elementi il messaggio non viene deserializzato correttamente
Tutto ciò mi fa pensare che venga serializzato tutto, e non soltanto il paginato, anche perchè provando ad inviare tutti e 500 gli elementi, senza paginare, succede esattamente la stessa cosa, e cioè, il service serializza, ma il client va in errore di deserializzazione
Se l'analisi è giusta, come si fa a non far serializzare tutto?