通过快速搜索 Stack Overflow ,我看到有人建议使用以下方法检查cookie是否存在:
HttpContext.Current.Response.Cookies["cookie_name"] != null
或(在Page
类中):
this.Response.Cookies["cookie_name"] != null
然而,当我尝试使用索引器(或Cookies.Get方法)来检索不存在的cookie时,似乎实际上创建具有该名称的“默认”cookie并返回因此,无论我使用什么cookie名称,它都不会返回null。 (更糟糕的是 - 创建一个不需要的cookie)
我在这里做错了什么,或者是否有一种不同的方式来简单地通过名称检查特定cookie的存在?
答案 0 :(得分:49)
有时您仍然需要知道Cookie是否存在于Response中。然后你可以检查cookie密钥是否存在:
HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
可以找到更多信息here。
在我的情况下,我不得不在Global.asax中的Application_EndRequest方法中修改Response Cookie。如果Cookie不存在,我不会碰它:
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
}
答案 1 :(得分:36)
这里有很多正确的答案取决于你想要完成的事情;这是我尝试提供全面的答案:
Request
和Response
对象都包含Cookies
个属性,即HttpCookieCollection
个对象。
<强> Request.Cookies:
强>
null
值。 <强> Response.Cookies:
强>
Request.Cookies
集合中,则会添加该Cookie(但如果Request.Cookies
对象已包含具有相同密钥的Cookie,即使它的值过时,也不会更新它以反映Response.Cookies
集合中新创建的cookie的更改。<强>解决方案强>
如果要检查客户端是否存在cookie,请执行以下操作之一
Request.Cookies["COOKIE_KEY"] != null
Request.Cookies.Get("COOKIE_KEY") != null
Request.Cookies.AllKeys.Contains("COOKIE_KEY")
如果要检查服务器在当前请求期间添加的cookie是否存在,请执行以下操作:
Response.Cookies.AllKeys.Contains("COOKIE_KEY")
(请参阅here)尝试通过以下方法之一检查服务器在当前请求中添加的Cookie ...
Response.Cookies["COOKIE_KEY"] != null
Response.Cookies.Get("COOKIE_KEY") != null
(请参阅here) ...将导致在Response.Cookies
集合中创建Cookie,状态将评估为true
。
答案 2 :(得分:35)
您需要使用HttpContext.Current.Request.Cookies
,而不是Response.Cookies
。
附注:将Cookie复制到Response.Cookies.Add
上的请求,这会检查其中任何一个对新添加的Cookie的行为相同。但传入的cookie永远不会反映在Response
。
HttpResponse.Cookies属性中记录了此行为:
使用HttpResponse.Cookies集合添加cookie后,即使响应尚未发送到客户端,cookie也会立即在HttpRequest.Cookies集合中提供。
答案 3 :(得分:29)
Response.Cookies
包含将发送回浏览器的Cookie。如果您想知道cookie是否存在,您应该查看Request.Cookies
。
无论如何,要查看是否存在cookie,您可以查看Cookies.Get(string)
。 但是,如果您在Response对象上使用此方法且Cookie 不存在,则会创建该Cookie。
答案 4 :(得分:4)
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;
}
}
用法:
Request.Cookies.Exists("MyCookie")
答案 5 :(得分:2)
很抱歉,没有足够的代表添加评论,但是来自zmbq的回答:
无论如何,要查看cookie是否存在,您可以检查Cookies.Get(字符串),这不会修改cookie集合。
可能不完全正确,因为Cookies.Get(字符串)实际上会创建一个具有该名称的cookie,如果它还不存在的话。 但是,正如他所说,你需要查看Request.Cookies,而不是Response.Cookies 所以,像:
bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
答案 6 :(得分:0)
您可以执行以下操作来查找Cookie的值:
Request.Cookies[SESSION_COOKIE_NAME].Value