2010-11-23 5 views
5

Ho sperimentato codice che cancellerà tutti i cookie in un HttpContext.Response.Relazione tra HttpContext.Request.Cookies e HttpContext.Response.Cookies

Inizialmente, ho usato questo:

DateTime cookieExpires = DateTime.Now.AddDays(-1); 

for (int i = 0; i < HttpContext.Request.Cookies.Count; i++) 
{ 
    HttpContext.Response.Cookies.Add(
     new HttpCookie(HttpContext.Request.Cookies[i].Name, null) { Expires = cookieExpires }); 
} 

Tuttavia, questo errore con un OutOfMemoryException perché il ciclo for non esce - ogni volta che si aggiunge un cookie al Response, ma anche viene aggiunto al `Request .

il seguente approccio funziona:

DateTime cookieExpires = DateTime.Now.AddDays(-1); 

List<string> cookieNames = new List<string>(); 

for (int i = 0; i < HttpContext.Request.Cookies.Count; i++) 
{ 
    cookieNames.Add(HttpContext.Request.Cookies[i].Name); 
} 

foreach (string cookieName in cookieNames) 
{ 
    HttpContext.Response.Cookies.Add(
     new HttpCookie(cookieName, null) { Expires = cookieExpires }); 
} 

Quindi, qual è esattamente il rapporto tra HttpContext.Request.Cookies e HttpContext.Response.Cookies?

risposta

11

Request.Cookies contiene il set completo di cookie, sia quelli inviati dal browser al server che quelli appena creati sul server.

Response.Cookies contiene i cookie che il server invierà indietro.
Questa raccolta inizia vuota e deve essere modificata per modificare i cookie del browser.

La documentazione:

ASP.NET include due intrinseche biscotto collezioni. La raccolta è stata aperta allo tramite la raccolta Cookies di HttpRequest contiene i cookie trasmessi dal client al server nell'intestazione Cookie. La collezione accessibile tramite la raccolta Cookies di HttpResponse contiene nuovi cookie creati sul server e trasmessi al client nell'intestazione Set-Cookie.

Dopo aver aggiunto un cookie utilizzando la raccolta HttpResponse.Cookies, il cookie è immediatamente disponibile nella collezione HttpRequest.Cookies, anche se la risposta non è stato inviato al il cliente.


Il tuo primo esempio di codice dovrebbe funzionare se si effettua il ciclo for correre all'indietro.
I nuovi cookie verranno aggiunti dopo la fine, quindi il ciclo a ritroso li ignorerebbe.