À partir d'une recherche rapide sur Stack Overflow , j'ai vu des personnes suggérer la méthode suivante pour vérifier si un cookie existe:
HttpContext.Current.Response.Cookies["cookie_name"] != null
ou (dans une classe Page
):
this.Response.Cookies["cookie_name"] != null
Cependant, lorsque j'essaie d'utiliser l'indexeur (ou la méthode Cookies.Get) pour récupérer un cookie qui n'existe pas, il semble en fait créer un cookie 'par défaut' avec ce nom et le renvoyer, donc peu importe le nom du cookie que j'utilise, il ne renvoie jamais la valeur null. (et même pire - crée un cookie indésirable)
Est-ce que je fais quelque chose de mal ici, ou existe-t-il un moyen différent de simplement vérifier l'existence d'un cookie spécifique par son nom?
Response.Cookies
Contient les cookies qui seront renvoyés au navigateur. Si vous voulez savoir si un cookie existe, vous devriez probablement regarder dans Request.Cookies
.
Quoi qu'il en soit, pour voir si un cookie existe, vous pouvez vérifier Cookies.Get(string)
. Cependant, si vous utilisez cette méthode sur l'objet Response et que le cookie pas existe, alors ce cookie sera créé.
Voir Référence MSDN pour Méthode HttpCookieCollection.Get
(String)
Parfois, vous avez encore besoin de savoir si un cookie existe dans Response. Ensuite, vous pouvez vérifier si la clé de cookie existe:
HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
Plus d'informations peuvent être trouvées ici .
Dans mon cas, j'ai dû modifier Response Cookie dans la méthode Application_EndRequest dans Global.asax. Si Cookie n'existe pas, je n'y touche pas:
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
}
Il y a beaucoup de bonnes réponses ici en fonction de ce que vous essayez d'accomplir; voici ma tentative de fournir une réponse complète:
Les objets Request
et Response
contiennent les propriétés Cookies
, qui sont des objets HttpCookieCollection
.
Request.Cookies:
null
.Response.Cookies:
Request.Cookies
, Il sera ajouté (mais si le Request.Cookies
Objet contient déjà un cookie avec la même clé et, même si sa valeur est périmée, il ne sera pas mis à jour pour refléter les modifications apportées au cookie nouvellement créé dans la collection Response.Cookies
.Solutions
Si vous souhaitez vérifier l’existence d’un cookie du client, effectuez l’une des opérations suivantes:
Request.Cookies["COOKIE_KEY"] != null
Request.Cookies.Get("COOKIE_KEY") != null
Request.Cookies.AllKeys.Contains("COOKIE_KEY")
Si vous souhaitez vérifier l'existence d'un cookie ajouté par le serveur lors de la demande en cours, procédez comme suit:
Response.Cookies.AllKeys.Contains("COOKIE_KEY")
(voir ici )Tentative de recherche d’un cookie ajouté par le serveur lors de la demande en cours par l’une de ces méthodes ...
Response.Cookies["COOKIE_KEY"] != null
Response.Cookies.Get("COOKIE_KEY") != null
(voir ici )... entraînera la création d'un cookie dans la collection Response.Cookies
et l'état sera évalué à true
.
Vous devez utiliser HttpContext.Current.Request.Cookies
, ne pas Response.Cookies
.
Note latérale: les cookies sont copiés dans Request sur Response.Cookies.Add
, qui vérifie que l'un ou l'autre se comporte de la même manière pour les cookies récemment ajoutés. Mais les cookies entrants ne sont jamais reflétés dans Response
.
Ce comportement est documenté dans la propriété HttpResponse.Cookies :
Une fois que vous avez ajouté un cookie à l'aide de la collection HttpResponse.Cookies, celui-ci est immédiatement disponible dans la collection HttpRequest.Cookies, même si la réponse n'a pas été envoyée au client.
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;
}
}
Usage:
Request.Cookies.Exists("MyCookie")
Désolé, pas assez de rep pour ajouter un commentaire, mais de la réponse de zmbq:
Quoi qu'il en soit, pour voir si un cookie existe, vous pouvez vérifier Cookies.Get (chaîne), cela ne modifiera pas la collection de cookies.
n’est peut-être pas tout à fait correct, car Cookies.Get (chaîne) créera en réalité un cookie portant ce nom, s’il n’existe pas déjà. Cependant, comme il l'a dit, vous devez regarder Request.Cookies, pas Response.Cookies. Ainsi, quelque chose comme:
bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
Vous pouvez faire quelque chose comme ceci pour connaître la valeur des cookies:
Request.Cookies[SESSION_COOKIE_NAME].Value