从堆栈溢出快速搜索我看到有人建议检查是否一个cookie存在的方式如下:
HttpContext.Current.Response.Cookies["cookie_name"] != null
或(内部的Page
类):
this.Response.Cookies["cookie_name"] != null
然而,当我尝试使用索引(或Cookies.Get方法)来检索一个cookie不存在,似乎实际创建具有该名称的“默认”的cookie,并返回,我用这样无论什么cookie名它永远不会返回null。 (甚至更糟 - 产生不必要的cookie)
我在这里做得不对,或者是有某个名字的饼干是否存在等简单检查以不同的方式?
Answer 1:
Response.Cookies
包含将被发送回浏览器的cookie。 如果你想知道一个Cookie是否存在,你应该看看Request.Cookies
。
总之,看有没有cookie存在,你可以检查Cookies.Get(string)
。 但是,如果你使用Response对象对这个方法和cookie 不存在,那么该cookie将被创建。
请参阅MSDN参考HttpCookieCollection.Get
方法(String)
Answer 2:
有时你还需要知道,如果Cookie的响应存在。 然后,你可以检查的cookie项是否存在:
HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
更多信息可以发现在这里 。
在我来说,我不得不修改响应的Cookie在Global.asax中Application_EndRequest方法。 如果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
}
Answer 3:
您需要使用HttpContext.Current.Request.Cookies
,不Response.Cookies
。
附注:cookie被复制到更多关于Response.Cookies.Add
,这使得检查它们中的表现同样为新增加的饼干。 但是,进入饼干永远不会体现在Response
。
这种行为被记录在HttpResponse.Cookies属性:
通过使用HttpResponse.Cookies集合添加一个cookie,该cookie是HttpRequest.Cookies收集立即可用,即使响应尚未被发送到客户端。
Answer 4:
有很多这里取决于你试图完成什么正确答案的; 这里是我在为企业提供全面的答案尝试:
无论是Request
和Response
对象包含Cookies
性能,这是HttpCookieCollection
对象。
Request.Cookies:
- 该集合包含从客户端接收的cookie
- 此集合为只读
- 如果试图从这个集合来访问一个不存在的cookie,您将收到一个
null
值。
Response.Cookies:
- 该集合只包含了服务器的当前请求过程中加入饼干。
- 这个系列是可写的
- 如果试图从这个集合来访问一个不存在的cookie,您将收到一个新的Cookie对象; 如果您尝试访问该cookie 不会在存在
Request.Cookies
集合,它会被添加(但如果Request.Cookies
对象已包含具有相同关键字的cookie,即使它的值是陈旧的,它不会进行更新,以反映在新创建的cookie的变化Response.Cookies
集合。
解决方案
如果要检查来自客户端一个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")
见这里 )
尝试检查已经由服务器通过这些方法中的一种当前请求中加入一个cookie ...
-
Response.Cookies["COOKIE_KEY"] != null
-
Response.Cookies.Get("COOKIE_KEY") != null
(见这里 )
...会导致创建的cookie中的Response.Cookies
集合,国家将评估为true
。
Answer 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;
}
}
用法:
Request.Cookies.Exists("MyCookie")
Answer 6:
对不起,没有足够的代表,以添加评论,但是从zmbq的回答:
总之,看有没有cookie存在,你可以检查Cookies.Get(串),这将不会修改Cookie集合。
也许是不完全正确,因为Cookies.Get(字符串)实际上将创建一个cookie使用该名称,如果它不存在。 然而,正如他所说的,你不需要这么看着Request.Cookies时,不Response.Cookies,是这样的:
bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
Answer 7:
你可以做这样的事情,找出饼干的价值:
Request.Cookies[SESSION_COOKIE_NAME].Value
文章来源: Check if Cookie Exists