2009-04-09 25 views
9

Io sono la creazione di un cookie con:I cookie sono sempre scaduti

HttpCookie cookie = new HttpCookie("simpleorder"); 
cookie.Expires = DateTime.Now.AddYears(1); 
cookie["order"] = carModel.ToString(); 
cookie["price"] = price.ToString(); 
Response.Cookies.Add(cookie); 

Ma quando posso controllare un paio di secondi più tardi è scaduto e la data di scadenza è impostata a {01-01-0001 00:00: 00}. Io cerco di recuperare il codice da

HttpCookie cookie = Request.Cookies["simpleorder"]; 
if (cookie != null && cookie.Expires > DateTime.Now)... 

io non cancellare il cookie qualsiasi luogo, in modo da non so il motivo per cui scade?

+0

Aggiorna i cookie? Se aggiorni il tuo cookie, senza impostare il tempo di scadenza, non esisterà più. –

risposta

17

Questa è una cattiva comprensione comune. La raccolta di cookie di richiesta rappresenta i cookie inclusi nell'intestazione del cookie delle richieste. Tali cookie non contengono alcuna informazione relativa a quando scadono. Strettamente parlando, .NET avrebbe dovuto utilizzare due tipi diversi (RequestCookie e ResponseCookie), ma invece ha scelto di utilizzare lo stesso tipo per entrambe le circostanze.

Il valore di Scadenza ha senso solo quando si aggiungono i cookie alla risposta.

+1

Quindi l'unico modo per verificare se un cookie è scaduto è verificare se esiste? –

+1

Sì, questo è tutto. – AnthonyWJones

+1

Una soluzione comune, se è necessario conoscere la data di scadenza, è salvarla come valore all'interno del cookie. Potrebbe improvvisamente andare fuori sincrono, ma se si tratta di un cookie httponly, hai il potere di assicurarti che non accada;) –

2

All'inizio ero anche deluso dal fatto che i cookie di richiesta non hanno il valore Expires, ma dopo il debug utilizzando Fiddler2, so che il protocollo HTTP non include alcun valore Expires per la richiesta di cookie. .NET Framework non ha modo di esporre il valore Expires per i cookie di richiesta.

Se si utilizza Fiddler tra l'app e il browser, è possibile visualizzare il cookie di risposta inviato correttamente al browser con tutte le proprietà. Tuttavia, il cookie di richiesta nelle intestazioni http non ha il valore di scadenza, espone solo il nome e il valore del cookie. I browser devono inviare questa richiesta di intestazione, come specificato nello standard http. Il motivo per cui potrebbe essere la riduzione delle dimensioni e dei server Web non è necessario controllare nulla oltre ai valori.

Quindi non è necessario controllare il valore expires sulla richiesta Web, perché è ciò che si imposta su una risposta Web precedente. Se si riceve il cookie, significa che il cookie non è ancora scaduto. Una volta impostato il valore expires, il browser gestirà la scadenza. Se si desidera modificare la scadenza, è sufficiente impostare il nuovo valore sulla risposta.

Problemi correlati