4 messaggi dal 15 settembre 2010
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?
giusto per prova, invece di List<Elementi>, prova a farti restituire un array Elementi[]:
public Elementi[] ListaElementi(int pagina, int elementi)
{
var lista = _contextElementoSetWhere(p => pFase == 0)OrderByDescending(p => pData)ToList();

var result = listaPage(pagina, elementi);
if(null != result  && 0 != result.Count())
    return result.ToArray();
return null;
}


Inoltre prova anche a farti restituire un numero di elementi minore per pagina...

Davide Guida
Technical Architect @ Razorfish Healthware
http://davideguida.altervista.org
4 messaggi dal 15 settembre 2010
si, ho provato anche a passare un solo elemento, ma, come ho gia detto e ripeto, si comporta come se serializzasse l'intero contesto, altrimenti, come già detto, non si spiegherebbe il fatto che succede solo quando la tabella del database supera quota 500 elementi
4 messaggi dal 15 settembre 2010
Facendo un tentativo con il codice seguente, e cioè,

dopo aver eseguito la query e avere eseguito la paginazione

ho la variabile 'elementi' che è il risultato finale.

Se lo restituisco direttamente va sempre in errore come esposto nei post precedenti, ma se invece scrivo il codice seguente:

//prova
                result = new List<Elemento>();
                foreach (var elemento in elementi)
                {
                    var e = new Elemento();
                    e.PastePropertiesFrom(elemento);
                    result.Add(e);
                }


niente più errore. Ma il problema resta, perchè poi modificando l'elemento dall'interfaccia grafica, quando vado a chiamare il metodo di salvataggio per attaccare l'elemento al contesto e salvarlo va in errore perchè giustamente non ha un'entitykey assegnata.

Soluzioni?

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.