c# asp.net cookies webforms asp.net-4.0

c# - Compruebe si existe Cookie



asp.net cookies (7)

A veces, aún necesita saber si existe Cookie en Response. Luego puede verificar si la clave de cookie existe:

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")

Más información se puede encontrar here .

En mi caso, tuve que modificar Response Cookie en el método Application_EndRequest en Global.asax. Si Cookie no existe, no la toco:

string name = "myCookie"; HttpContext context = ((HttpApplication)sender).Context; HttpCookie cookie = null; if (context.Response.Cookies.AllKeys.Contains(name)) { cookie = context.Response.Cookies[name]; } if (cookie != null) { // update response cookie }

A partir de una búsqueda rápida en Stack Overflow , vi personas sugiriendo la siguiente forma de verificar si existe una cookie:

HttpContext.Current.Response.Cookies["cookie_name"] != null

o (dentro de una clase de Page ):

this.Response.Cookies["cookie_name"] != null

Sin embargo, cuando trato de usar el indexador (o el método Cookies.Get) para recuperar una cookie que no existe, parece que realmente crea una cookie ''predeterminada'' con ese nombre y la devuelve, así que no importa qué nombre de cookie use nunca devuelve nulo. (y lo que es peor, crea una cookie no deseada)

¿Estoy haciendo algo mal aquí, o hay una manera diferente de simplemente verificar la existencia de una cookie específica por su nombre?


Aquí hay muchas respuestas correctas según lo que intenta lograr; aquí está mi intento de proporcionar una respuesta integral:

Los objetos Request y Response contienen propiedades de Cookies , que son objetos HttpCookieCollection .

Request.Cookies:

  • Esta colección contiene cookies recibidas del cliente
  • Esta colección es de solo lectura
  • Si intenta acceder a una cookie inexistente de esta colección, recibirá un valor null .

Response.Cookies:

  • Esta colección contiene solo cookies que el servidor ha agregado durante la solicitud actual.
  • Esta colección es grabable
  • Si intenta acceder a una cookie inexistente de esta colección, recibirá un nuevo objeto cookie; Si la cookie que intentó acceder NO existe en la colección Request.Cookies , se agregará (pero si el objeto Request.Cookies ya contiene una cookie con la misma clave, e incluso si su valor está obsoleto, no lo hará). actualizarse para reflejar los cambios de la cookie recién creada en la colección Response.Cookies .

Soluciones

Si desea verificar la existencia de una cookie del cliente, realice una de las siguientes acciones

  • Request.Cookies["COOKIE_KEY"] != null
  • Request.Cookies.Get("COOKIE_KEY") != null
  • Request.Cookies.AllKeys.Contains("COOKIE_KEY")

Si desea verificar la existencia de una cookie que ha sido agregada por el servidor durante la solicitud actual , haga lo siguiente:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY") (ver here )

Intentando buscar una cookie que ha sido agregada por el servidor durante la solicitud actual por uno de estos métodos ...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (ver here )

... dará como resultado la creación de una cookie en la colección Response.Cookies y el estado se evaluará como true .


Lo sentimos, no hay suficientes representantes para agregar un comentario, pero a partir de la respuesta de zmbq:

De todos modos, para ver si existe una cookie, puede marcar Cookies. Get (cadena), esto no modificará la colección de cookies.

es posible que no sea completamente correcto, como Cookies.Get (string) creará una cookie con ese nombre, si no existe. Sin embargo, como dijo, debe mirar Request.Cookies, no Response.Cookies Entonces, algo así como:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;


Necesita utilizar HttpContext.Current.Request.Cookies , no Response.Cookies .

Nota al margen: las cookies se copian en Solicitud en Response.Cookies.Add , lo que hace que la comprobación de cualquiera de ellas se comporte igual para las cookies recién agregadas. Pero las cookies entrantes nunca se reflejan en Response .

Este comportamiento está documentado en la propiedad HttpResponse.Cookies :

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


Puede hacer algo como esto para conocer el valor de las cookies:

Request.Cookies[SESSION_COOKIE_NAME].Value


Response.Cookies contiene las cookies que se enviarán de vuelta al navegador. Si desea saber si existe una cookie, probablemente debería buscar en Request.Cookies .

De todos modos, para ver si existe una cookie, puede verificar Cookies.Get(string) . Sin embargo, si usa este método en el objeto Response y la cookie no existe, entonces se creará esa cookie.

Consulte la referencia de MSDN para HttpCookieCollection.Get Method (String)


public static class CookieHelper { /// <summary> /// Checks whether a cookie exists. /// </summary> /// <param name="cookieCollection">A CookieCollection, such as Response.Cookies.</param> /// <param name="name">The cookie name to delete.</param> /// <returns>A bool indicating whether a cookie exists.</returns> public static bool Exists(this HttpCookieCollection cookieCollection, string name) { if (cookieCollection == null) { throw new ArgumentNullException("cookieCollection"); } return cookieCollection[name] != null; } }

Uso:

Request.Cookies.Exists("MyCookie")