55

通过对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 的存在?

4

7 回答 7

61

有时你仍然需要知道 Cookie 是否存在于 Response 中。然后你可以检查cookie key是否存在:

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

更多信息可以在这里找到。

就我而言,我必须在 Global.asax 的 Application_EndRequest 方法中修改响应 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
}
于 2012-11-07T14:59:02.813 回答
53

根据您要完成的工作,这里有很多正确的答案;这是我提供全面答案的尝试:

Request和对象都Response包含Cookies属性,即HttpCookieCollection对象。

Request.Cookies:

  • 此集合包含从客户端收到的 cookie
  • 此集合是只读的
  • 如果您尝试访问此集合中不存在的 cookie,您将收到一个null值。

Response.Cookies:

  • 此集合仅包含服务器在当前请求期间添加的 cookie。
  • 这个集合是可写的
  • 如果您尝试访问此集合中不存在的 cookie,您将收到一个新的 cookie 对象;如果您尝试访问的 cookie在集合中存在Request.Cookies,它将被添加(但如果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")(见这里

正在尝试通过以下方法之一检查服务器在当前请求期间添加的 cookie ...

  • Response.Cookies["COOKIE_KEY"] != null
  • Response.Cookies.Get("COOKIE_KEY") != null(见这里

...将导致在Response.Cookies集合中创建一个 cookie,并且状态将评估为true.

于 2015-05-13T18:54:53.577 回答
42

Response.Cookies包含将发送回浏览器的 cookie。如果您想知道 cookie 是否存在,您可能应该查看Request.Cookies.

无论如何,要查看 cookie 是否存在,您可以检查Cookies.Get(string). 但是,如果您在 Response 对象上使用此方法并且 cookie存在,则将创建该 cookie。

有关方法(字符串),请参阅 MSDN 参考HttpCookieCollection.Get

于 2012-10-24T22:10:57.050 回答
36

你需要使用HttpContext.Current.Request.Cookies,而不是Response.Cookies

旁注:cookie 被复制到 Request on Response.Cookies.Add,这使得检查它们中的任何一个对于新添加的 cookie 的行为相同。但传入的 cookie 永远不会反映在Response.

此行为记录在HttpResponse.Cookies属性中:

使用 HttpResponse.Cookies 集合添加 cookie 后,即使尚未将响应发送到客户端,该 cookie 也会立即在 HttpRequest.Cookies 集合中可用。

于 2012-10-24T22:11:40.303 回答
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")
于 2013-05-06T13:01:12.440 回答
2

抱歉,没有足够的代表添加评论,但来自 zmbq 的回答:

无论如何,要查看 cookie 是否存在,您可以检查 Cookies.Get(string),这不会修改 cookie 集合。

可能不完全正确,因为 Cookies.Get(string) 实际上会创建一个具有该名称的 cookie,如果它不存在的话。但是,正如他所说,您需要查看 Request.Cookies,而不是 Response.Cookies 所以,类似于:

bool cookieExists = HttpContext.Current.Request.Cookies["cookie_name"] != null;
于 2013-01-09T06:12:11.770 回答
0

您可以执行以下操作来找出 cookie 的值:

Request.Cookies[SESSION_COOKIE_NAME].Value
于 2014-10-29T14:24:16.967 回答