944 messaggi dal 11 febbraio 2013
Ciao,
volevo chiedere come posso sfruttare il meccanismo del Outputcache in un progetto
dove le pagine sono tutte visualizzazioni basate su filtri fra i quali il nome dell'utente.

Le ottimizzazioni che potevo fare analizzando il codice prodotto dall'entity framework le ho fatte.

Volevo capire se posso ridurre i tempi anche con questa possibilità ma non vorrei che utenti diversi vedano lo stesso risultato visto che i dati sono personali e soprattutto non ho mai usato questa tecnica.

Dimenticavo di specificare che il database è aggiornato una volta al giorno.

grazie
Modificato da jjchuck il 13 marzo 2018 16.34 -
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
puoi far variare la cache in base a criteri personalizzati, come per esempio in base all'utente loggato.
http://blog.danielcorreia.net/asp-net-mvc-vary-by-current-user/

Come vedi, l'attributo OutputCache dispone di varie proprietà VaryBy*. La VaryByCustom è quella che ti dà un controllo esatto. Magari fai delle prove con vari utenti prima di mettere in produzione la modifica.


Dimenticavo di specificare che il database è aggiornato una volta al giorno.

Ok, è lo scenario ideale per fare caching in maniera aggressiva. Imposta la duration a 3600 secondi (1 ora) o più.

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Quando hai scritto "aggressiva" mi sono 'eccitato' :)

Ho provato sulla vista piu lenta

ho fatto come nell'esempio... piu o meno


 [OutputCache(Duration =3600, VaryByCustom = "User")] //Global.asax override GetVaryByCustomString
        public ActionResult Index(...)
        {           
            string codiceUtente = Utility.Codice();
             
            var model = _dbContext.Ordini.Where( i=> i.codice == codiceUtente && ...altri filtri nella pagina
          
...
}


public override string GetVaryByCustomString(HttpContext context, string arg)
        { 
            if (arg.Equals("User", StringComparison.InvariantCultureIgnoreCase))
            {
                 //var x = System.Web.HttpContext.Current.User.Identity.Name;
                 var user = context.User.Identity;
                return string.Format("{0}", user.Name);
            }
            return base.GetVaryByCustomString(context, arg);
        }


Il caching funziona ma loggandomi con un altro account e andando sulla pagina o visto che ritorna i dati
dell'altro utente

Cmq non uso asp.net Idenity ma una mia tabella e simpleCrypto

Cosa sbaglio ?

ps: ma questo caching cosa memorizza dati e html ?
e dove sul server ?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
tipicamente lo username dell'utente loggato si trova qui:
context.User.Identity.Name;

Che è la stessa cosa che scrivere:
System.Web.HttpContext.Current.User.Identity.Name


Se tu stai usando un meccanismo di autenticazione personalizzato, può darsi che lo username non si trovi lì ma da qualche altra parte. Nella tua applicazione come fai a ottenere lo username dell'utente loggato?


ps: ma questo caching cosa memorizza dati e html ?

Sì, l'output di pagina, cioè tutto il contenuto della risposta che viene inviata al client.


e dove sul server ?

Questo dipende dal valore della proprietà Location. Prova ad impostare il valore esplicitamente su "Server".
Questi valori di Location servono a determinare il valore dell'intestazione HTTP Cache-Control che sia IIS che il browser client sanno interpretare per capire come mettere in cache il contenuto.

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
In realtà uso un codice di tre caratteri per filtrare tutti i model che ho
Ma con il nome sarebbe uguale: prenderei solo la property "UserName"

Ho una classe Utility
public static String CodiceUtente()
        {
            string codice = null;
            using (MyDbEntitiesUsersContext db = new MyDbEntitiesUsersContext(@"xxx"))
            {
                codice = (from u in db.Utenti
                           where u.UserName == System.Web.HttpContext.Current.User.Identity.Name
                            select u.Codice).
                                            FirstOrDefault().ToString();
            }
            return codice;
        }

Modificato da jjchuck il 14 marzo 2018 14.40 -
944 messaggi dal 11 febbraio 2013
Impostando la location su Server funziona :)
evviva

Ora lo pubblico solo su una vista e spero di non avere errori...se poi va lo uso anche in altre viste 'lente'

quel che mi chiedo è se posso inserire anche i parametri della pagina nel VarByCustom (Linea, data, documento...ecc)...
oppure sto dicendo una scemenza ?


ciao e mille grazie per il sostegno
11.886 messaggi dal 09 febbraio 2002
Contributi
Beh, l'URL è già una discriminante. Se stai fornendo i parametri via query string di una richiesta GET, penso che non ci sia da fare altro.

Per caso hai notato che ti viene restituita sempre la stessa pagina anche se cambi i valori nell'url?

ciao,
Moreno

Enjoy learning and just keep making
944 messaggi dal 11 febbraio 2013
Se cambio i valori nell'url la pagina per fortuna restituisce valori diversi

posso fare un altro test per essere sicuro che effettivamente il caching funzioni?

ciao ciao

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.