Domanda

La memorizzazione dell'intera sessione in un cookie è stata standard in Rails negli ultimi anni: esiste un modo semplice per ottenere qualcosa di simile con ASP MVC?

Per impostazione predefinita, qualsiasi cosa in Session / TempData è archiviata nella memoria del server. In web.config questo può essere cambiato in una memoria SQL Store / lato server. Mi piacerebbe avere questi oggetti persistenti in un cookie.

Sembra che potrei implementare un provider di negozi Session-State personalizzato. Esiste un approccio più semplice?

È stato utile?

Soluzione

sì, implementa un fornitore di sessioni con stato personalizzato . E no, non c'è un approccio più semplice.

Ps. non è così male come sembra, ad esempio > metà del campione odbc sta scrivendo nel db.

Altri suggerimenti

Penso che sarebbe molto più efficiente archiviare l'ID di sessione (un hash o altro) nel cookie, quindi utilizzare quell'ID per ottenere i dati di sessione dalla memoria / dal database / dall'archiviazione che preferisci. Mantenere lo stato di sessione completo in un cookie aumenta la larghezza di banda inutilmente.

Inoltre, tieni presente la sicurezza: se il cookie contiene informazioni di autenticazione o altri dati sensibili e non stai attento, può essere facilmente hackerato dall'utente per ottenere privilegi o altrimenti pasticciare con la tua applicazione (anche la crittografia dei dati fa schifo , perché quindi è necessario codificare in base 64 i dati crittografati, il che spreca ulteriormente la larghezza di banda e il tempo di elaborazione). Dovresti non mai fidarsi dell'input dell'utente.

Scoraggerei fortemente la memorizzazione dell'intera sessione nei cookie. Ha conseguenze negative sulle prestazioni. Considera questo: ogni richiesta (a ogni risorsa) conterrà un sovraccarico di dati eventualmente obsoleti di cui hai bisogno solo una o due volte. Alla fine questo sovraccarico colpirà i tuoi utenti, la tua larghezza di banda e le prestazioni del tuo sito.

Ecco un esempio:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

La dimensione della richiesta iniziale è di circa 200 byte. Diciamo, aggiungi circa 100 byte alla tua sessione. Ora la dimensione è di 300 byte e il sovraccarico è del 30% circa. Aggiungete altri 100 byte e il sovraccarico è del 50%. Ciò significa che richiede circa 2 volte il tempo per inviare la richiesta e 2x la larghezza di banda.

Dovresti piuttosto guardare implementazione TempData basata su cookie poiché ha un ingombro molto ridotto e ha effettivamente senso.

Raccomando di memorizzare TempData nel cookie (al contrario dell'intera sessione).

Per memorizzare TempData nel cookie, è necessario sovrascrivere ITempDataProvider e implementare il proprio provider personalizzato.

In realtà è disponibile un pacchetto nuget (che esegue questa implementazione personalizzata per te): BrockAllen.CookieTempData e ecco la documentazione . La cosa buona di questo pacchetto è che comprime e crittografa il tuo TempData , quindi non devi preoccuparti di inviare testo in chiaro su Internet.

Tutto quello che devi fare è installare il pacchetto nuget e quindi sovrascrivere CreateTempDataProvider nella tua classe ControllerBase :

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}

Non dovresti usare Sessioni per questo, ma Profili invece. I profili utilizzano i cookie per abbinare i computer ai profili, ecc. La chiave del profilo viene memorizzata in un cookie e non viene persa alla chiusura del browser, ecc.

Informazioni qui; http://odetocode.com/articles/440.aspx

dipende dal tipo di dati che si desidera archiviare nel cookie, se si desidera archiviare solo la stringa, verrà eseguito il seguente codice:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top