2010-11-23 13 views
5

He estado experimentando con un código que borrará todas las cookies en un HttpContext.Response.Relación entre HttpContext.Request.Cookies y HttpContext.Response.Cookies

Inicialmente, utilicé esta:

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

Sin embargo, esto va a error con un OutOfMemoryException porque el bucle for nunca se sale - cada vez que se agrega una cookie al Response, también se agrega a la `Solicitud .

El enfoque siguientes obras:

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

Así que, ¿cuál es exactamente la relación entre HttpContext.Request.Cookies y HttpContext.Response.Cookies?

Respuesta

11

Request.Cookies contiene el conjunto completo de cookies, tanto las que el navegador envía al servidor como las que acaba de crear en el servidor.

Response.Cookies contiene las cookies que el servidor enviará de vuelta.
Esta colección comienza vacía y se debe cambiar para modificar las cookies del navegador.

La documentación indica:

ASP.NET incluye dos galletas colecciones intrínsecas. La colección accedió al a través de la colección Cookies de HttpRequest contiene las cookies transmitidas por el cliente al servidor en el encabezado Cookie. La colección a la que se accede a través de la colección de cookies de HttpResponse contiene nuevas cookies creadas en el servidor y se transmiten al cliente en el encabezado Set-Cookie.

Después de agregar una cookie utilizando la colección HttpResponse.Cookies, la cookie es inmediatamente disponible en la colección HttpRequest.Cookies, incluso si la respuesta no se ha enviado a el cliente.


Su primer ejemplo de código debería funcionar si se hace el bucle for correr hacia atrás.
Las nuevas cookies se agregarán después del final, por lo que el ciclo hacia atrás las ignoraría.

Cuestiones relacionadas