Check if Cookie Exists
From a quick search on Stack Overflow I saw people suggesting the following way of checking if a cookie exists:
HttpContext.Current.Response.Cookies["cookie_name"] != null
or (inside a Page
class):
this.Response.Cookies["cookie_name"] != null
However, when I try to use the indexer (or the Cookies.Get method) to retrieve a cookie that does not exist it seems to actually create a 'default' cookie with that name and return that, thus no matter what cookie name I use it never returns null. (and even worse - creates an unwanted cookie)
Am I doing something wrong here, or is there a different way of simply checking for the existance of a specific cookie by name?
Solution 1:
Sometimes you still need to know if Cookie exists in Response. Then you can check if cookie key exists:
HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
More info can be found here.
In my case I had to modify Response Cookie in Application_EndRequest method in Global.asax. If Cookie doesn't exist I don't touch it:
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
}
Solution 2:
There are a lot of right answers here depending on what you are trying to accomplish; here's my attempt at providing a comprehensive answer:
Both the Request
and Response
objects contain Cookies
properties, which are HttpCookieCollection
objects.
Request.Cookies:
- This collection contains cookies received from the client
- This collection is read-only
- If you attempt to access a non-existent cookie from this collection, you will receive a
null
value.
Response.Cookies:
- This collection contains only cookies that have been added by the server during the current request.
- This collection is writeable
- If you attempt to access a non-existent cookie from this collection, you will receive a new cookie object; If the cookie that you attempted to access DOES NOT exist in the
Request.Cookies
collection, it will be added (but if theRequest.Cookies
object already contains a cookie with the same key, and even if it's value is stale, it will not be updated to reflect the changes from the newly-created cookie in theResponse.Cookies
collection.
Solutions
If you want to check for the existence of a cookie from the client, do one of the following
Request.Cookies["COOKIE_KEY"] != null
Request.Cookies.Get("COOKIE_KEY") != null
Request.Cookies.AllKeys.Contains("COOKIE_KEY")
If you want to check for the existence of a cookie that has been added by the server during the current request, do the following:
-
Response.Cookies.AllKeys.Contains("COOKIE_KEY")
(see here)
Attempting to check for a cookie that has been added by the server during the current request by one of these methods...
Response.Cookies["COOKIE_KEY"] != null
-
Response.Cookies.Get("COOKIE_KEY") != null
(see here)
...will result in the creation of a cookie in the Response.Cookies
collection and the state will evaluate to true
.
Solution 3:
Response.Cookies
contains the cookies that will be sent back to the browser. If you want to know whether a cookie exists, you should probably look into Request.Cookies
.
Anyway, to see if a cookie exists, you can check Cookies.Get(string)
. However, if you use this method on the Response object and the cookie doesn't exist, then that cookie will be created.
See MSDN Reference for HttpCookieCollection.Get
Method (String)
Solution 4:
You need to use HttpContext.Current.Request.Cookies
, not Response.Cookies
.
Side note: cookies are copied to Request on Response.Cookies.Add
, which makes check on either of them to behave the same for newly added cookies. But incoming cookies are never reflected in Response
.
This behavior is documented in HttpResponse.Cookies property:
After you add a cookie by using the HttpResponse.Cookies collection, the cookie is immediately available in the HttpRequest.Cookies collection, even if the response has not been sent to the client.
Solution 5:
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")