Quando utilizzare Request.Cookies su Response.Cookies?


57

È possibile utilizzare la risposta quando si verifica un evento di pagina (ad esempio carico) poiché si tratta di una risposta di ASP.NET e richiesta quando si preme un pulsante poiché si tratta di una risposta inviata ad ASP.NET per l'elaborazione? O c'è dell'altro?

39

In un'applicazione Web la richiesta è ciò che proviene dal browser e la risposta è ciò che il server invia. Quando si convalidano cookie o dati dei cookie dal browser, è necessario utilizzare Request.Cookies. Quando si costruiscono i cookie da inviare al browser, è necessario aggiungerli a Response.Cookies.


95

Sono 2 cose diverse, una salva [risposta], l'altra LEGGE [Richiesta]

in un cookie (informatica parlando) :) si salva un file di piccole dimensioni per un periodo di tempo che contiene un oggetto di tipo stringa di

nel .NET framework si save a cookie fare:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
DateTime now = DateTime.Now; 

// Set the cookie value. 
myCookie.Value = now.ToString(); 
// Set the cookie expiration date. 
myCookie.Expires = now.AddMinutes(1); 

// Add the cookie. 
Response.Cookies.Add(myCookie); 

Response.Write("<p> The cookie has been written."); 

Hai scritto un cookie che sarà disponibile per un minuto ... normalmente facciamo now.AddMonth (1) in modo da poter salvare un cookie per un intero mese.

Per retrieve a cookie, si utilizza la richiesta (si richiede), come:

HttpCookie myCookie = new HttpCookie("MyTestCookie"); 
myCookie = Request.Cookies["MyTestCookie"]; 

// Read the cookie information and display it. 
if (myCookie != null) 
    Response.Write("<p>"+ myCookie.Name + "<p>"+ myCookie.Value); 
else 
    Response.Write("not found"); 

Ricorda:

Per eliminare un cookie, non esiste un codice diretto, il trucco è quello di Salva lo stesso Nome cookie con una data di scadenza già passata, ad esempio .AddMinutes (-1)

questo cancellerà il cookie.

Come potete vedere, ogni volta che scade l'ora della vita del cookie, quel file viene eliminato automaticamente dal sistema.

+7

+1 non mi rendevo conto si doveva salvare nuovamente il cookie di aggiornare la scadenza 29 apr. 102010-04-29 10:48:05

+2

+1 ma semplice spiegazione chiara 27 ago. 132013-08-27 12:49:19

+1

Questo era per lo più disponibile, ma un po' fuorviante in quanto nel tuo esempio quando vai a recuperare il cookie, in realtà sovrascrivi il cookie precedentemente salvato con la riga 'HttpCookie myCookie = new HttpCookie (" MyTestCookie "); usa invece qualcosa come' HttpCookie myCookie = new HttpCookie ("MyWrittenCookie") ; ' 14 nov. 132013-11-14 20:16:28

+1

Questo non supporta la lettura di un cookie appena inviato nella risposta, nel qual caso è necessario utilizzare' Response.Cookies' 13 ott. 152015-10-13 03:27:17

  0

Credo che questo sia vero quando si programma codice lato server. per il codice cliente è il contrario. 30 mar. 172017-03-30 08:59:06


4

I cookie provengono dal browser nella raccolta Request.Cookies. È qui che leggi i cookie inviati.

Per inviare i cookie al browser, li si inserisce nella raccolta Response.Cookies.

Se si desidera eliminare un cookie, è necessario indicare al browser di rimuoverlo inviando il cookie con una data di scadenza che è scaduta. Il browser utilizza l'ora locale del computer client, quindi se si sta utilizzando il tempo del server per creare una data, assicurarsi di sottrarre almeno un giorno per assicurarsi che sia effettivamente passato nell'ora locale dei client.


16

Quando si scrive un cookie, utilizzare Risposta ma la lettura può dipendere dalla situazione. Normalmente, si legge dalla richiesta ma se la propria applicazione sta tentando di ottenere un cookie che è appena stato scritto o aggiornato e il round trip sul browser non si è verificato, potrebbe essere necessario leggerlo in forma di risposta.

Ho usato questo modello per un po 'e funziona bene per me.

public void WriteCookie(string name, string value) 
{ 
    var cookie = new HttpCookie(name, value); 
    HttpContext.Current.Response.Cookies.Set(cookie); 
} 


public string ReadCookie(string name) 
{ 
    if (HttpContext.Current.Response.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Response.Cookies[name]; 
     return cookie.Value; 
    } 

    if (HttpContext.Current.Request.Cookies.AllKeys.Contains(name)) 
    { 
     var cookie = HttpContext.Current.Request.Cookies[name]; 
     return cookie.Value; 
    } 

    return null; 
} 
+4

Un approccio alternativo ma uguale sarebbe semplicemente scrivere il tuo cookie sulle raccolte Response.Cookies AND Request.Cookies durante il salvataggio. In questo modo, ogni ulteriore logica del ciclo può leggere il cookie che hai appena impostato senza guardare nell'oggetto Response. 23 feb. 092009-02-23 00:59:23

  0

Chris, d'accordo e lo facevo, ma di recente ho letto che modificare l'oggetto Richiesta è un no-no. Cercherò di trovare un riferimento. 23 feb. 092009-02-23 01:11:32

  0

Grazie, Chris. Andrew - Mi piacerebbe vedere questa referenza. Per ora vado con la soluzione di Chris. 09 set. 092009-09-09 19:30:37

  0

Un modello utile, ma si noti che non è sicuro al 100% thread 12 set. 132013-09-12 20:50:52


2

Quando ho creare o aggiornare un cookie nel .NET faccio normalmente esso sia la richiesta e la raccolta di cookie di risposta. In questo modo puoi essere sicuro che se proverai a leggere il cookie più in basso nella sequenza di richiesta della pagina, avrà le informazioni corrette.

  0

Alex, questo particolare problema mi ha infastidito tutto il giorno. Grazie per averlo chiarito in modo così semplice! 09 set. 092009-09-09 19:29:53

  0

Sì, ci sono alcuni comportamenti interessanti in cui l'impostazione di un cookie in Response lo imposterà anche nella richiesta se non esistesse già. Ma se già esistesse nella Richiesta, l'impostazione di Risposta NON aggiorna la Richiesta. Quindi sembra una funzionalità pensata per essere utile, ma alquanto incoerente. Certamente quando si modificano i tempi di un cookie multipli nella stessa richiesta è possibile incorrere in bug. 09 lug. 142014-07-09 21:31:02


1

Il codice di Andrew ha restituito un errore nel metodo "AllKeys.Contains". Così ho corretto un po '..

public void WriteCookie(string strCookieName, string strCookieValue) 
    { 
     var hcCookie = new HttpCookie(strCookieName, strCookieValue); 
     HttpContext.Current.Response.Cookies.Set(hcCookie); 
    } 


    public string ReadCookie(string strCookieName) 
    {  
     foreach (string strCookie in HttpContext.Current.Response.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Response.Cookies[strCookie].Value; 
      } 
     }   

     foreach (string strCookie in HttpContext.Current.Request.Cookies.AllKeys) 
     { 
      if (strCookie == strCookieName) 
      { 
       return HttpContext.Current.Request.Cookies[strCookie].Value; 
      } 
     } 

     return null; 
    } 
  0

Ti sei ricordato di includere System.Linq? Farlo ha corretto l'errore sul mio file. 06 feb. 122012-02-06 16:04:44

  0

Se questo è solo un piccolo errore suggerire meglio una modifica al post originale prima di duplicare la risposta. 06 dic. 122012-12-06 17:11:46