2010-11-23 7 views
5

J'ai expérimenté avec du code qui va effacer tous les cookies dans un HttpContext.Response.Relation entre HttpContext.Request.Cookies et HttpContext.Response.Cookies

Dans un premier temps, je ceci:

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 }); 
} 

Cependant, cela erreur avec un OutOfMemoryException car la boucle for sort jamais - chaque fois que vous ajoutez un cookie au Response, il obtient également ajouté à la `demande .

Les travaux approche suivante:

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 }); 
} 

Alors, quelle est la relation entre exactement HttpContext.Request.Cookies et HttpContext.Response.Cookies?

Répondre

11

Request.Cookies contient l'ensemble complet de cookies, à la fois ceux que le navigateur envoie au serveur et ceux que vous venez de créer sur le serveur.

Response.Cookies contient les cookies que le serveur va renvoyer.
Cette collection commence vide et devrait être modifié pour modifier les cookies du navigateur.

La documentation indique:

ASP.NET comprend deux cookies intrinsèques collections. La collection accédée via la collection Cookies de HttpRequest contient les cookies transmis par le client au serveur dans l'en-tête du cookie. La collection accessible via la collection de cookies de HttpResponse contient de nouveaux cookies créés sur le serveur et transmis au client dans l'en-tête Set-Cookie.

Après avoir ajouté un cookie en utilisant le HttpResponse.Cookies collection, le cookie est immédiatement disponible dans la collection HttpRequest.Cookies, même si la réponse n'a pas été envoyé à le client.


Votre premier exemple de code devrait fonctionner si vous faire la course en boucle for en arrière.
Les nouveaux cookies seront ajoutés après la fin, donc la boucle arrière les ignorerait.

Questions connexes