Comprobar si existe una Cookie


De una búsqueda rápida en Stack Overflow Vi gente sugiriendo la siguiente forma de verificar si existe una cookie:

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

O (dentro de una clase Page):

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

Sin embargo, cuando intento usar el indexador (o las Cookies.Get method) para recuperar una cookie que no existe, parece que en realidad crea una cookie 'predeterminada' con ese nombre y la devuelve, por lo tanto, no importa qué nombre de cookie use, nunca devuelve null. (y aún peor - crea un no deseado cookie)

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

Author: Acidic, 2012-10-25

7 answers

Response.Cookies contiene las cookies que serán enviadas 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 comprobar Cookies.Get(string). Sin embargo, si utiliza este método en el objeto Response y la cookie no existe, entonces se creará esa cookie.

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

 27
Author: zmbq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-22 14:50:20

A veces todavía necesita saber si existe una cookie en respuesta. A continuación, puede comprobar si existe la clave de cookie:

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

Se puede encontrar más información aquí.

En mi caso tuve que modificar la Cookie de respuesta 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
}
 41
Author: marisks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-07 14:59:02

Necesitas usar HttpContext.Current.Request.Cookies, no Response.Cookies.

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

Este comportamiento está documentado en HttpResponse.Cookies propiedad:

Después de agregar una cookie usando HttpResponse.Recopilación de cookies, la cookie está inmediatamente disponible en el HttpRequest.Recopilación de cookies, incluso si el la respuesta no ha sido enviada al cliente.

 35
Author: Alexei Levenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-29 21:13:17

Hay muchas respuestas correctas aquí dependiendo de lo que usted está tratando de lograr; aquí está mi intento de proporcionar una respuesta completa:{[19]]}

Tanto los objetos Request como Response contienen propiedades 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á una null valor.

Response.Cookies:

  • Esta colección solo contiene cookies que han sido agregadas por el servidor durante la solicitud actual.
  • Esta colección es escribible
  • Si intenta acceder a una cookie inexistente de esta colección, recibirá un nuevo objeto de cookie; Si la cookie a la 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 se actualizará para reflejar los cambios de la cookie recién creada en la colección Response.Cookies.

Soluciones


Si desea comprobar 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 comprobar la existencia de una cookie que ha sido añadida por el servidor durante el solicitud actual, haga lo siguiente:

  • Response.Cookies.AllKeys.Contains("COOKIE_KEY") (ver aquí)

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

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null (véase aquí )

...dará lugar a la creación de una cookie en la colección Response.Cookies y el estado evaluará a true.

 31
Author: Trevor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-21 16:55:46
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")
 4
Author: Levitikon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-06 13:01:12

Lo sentimos, no es suficiente rep para agregar un comentario, pero de la respuesta de zmbq:

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

Tal vez no es completamente correcto, como las cookies.Get (string) creará una cookie con ese nombre, si aún no existe. Sin embargo, como él dijo, usted necesita estar mirando la Petición.Cookies, no Respuesta.Cookies Entonces, algo como:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
 2
Author: Fiddles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-11 06:26:36

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

Request.Cookies[SESSION_COOKIE_NAME].Value
 0
Author: Hernan Bogantes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-29 14:29:41