2010-11-23 10 views
5

Eksperymentowałem z kodem, który wyczyści wszystkie pliki cookie w HttpContext.Response.Relacje między HttpContext.Request.Cookies i HttpContext.Response.Cookies

Początkowo używałem to:

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

Jednak to będzie błąd z obiektem OutOfMemoryException ponieważ pętla for nigdy nie wychodzi - za każdym razem dodać plik cookie do Response, to również zostanie dodany do `Zamówienie .

następujące podejście działa:

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

Więc, co dokładnie jest związek między HttpContext.Request.Cookies i HttpContext.Response.Cookies?

Odpowiedz

11

Request.Cookies zawiera komplet plików cookie, zarówno tych, które przeglądarka wysyła do serwera, jak i tych, które właśnie utworzyłeś na serwerze.

zawiera pliki cookie, które serwer odeśle.
Ta kolekcja zaczyna się pusta i należy ją zmienić, aby zmodyfikować pliki cookie przeglądarki.

Dokumentacja stwierdza:

ASP.NET zawiera dwie wewnętrzne cookies kolekcji. Kolekcja dostępna pod numerem za pośrednictwem kolekcji Cookies pod numerem HttpRequest zawiera pliki cookie przesłane przez klienta na serwer w nagłówku Cookie. Kolekcja dostępna za pośrednictwem kolekcji plików cookie HttpResponse , zawiera nowe pliki cookie utworzone na serwerze i przesłane do klienta w nagłówku pliku cookie.

Po dodaniu cookie za pomocą HttpResponse.Cookies zebraniu Cookie jest natychmiast dostępny w HttpRequest.Cookies kolekcji, nawet jeśli odpowiedź nie została wysłana do klienta.


Twoja pierwsza próbka kod powinien działać, jeśli sprawiają, że pętla for działać wstecz.
Nowe pliki cookie zostaną dodane po zakończeniu, więc pętla wstecz zignoruje je.