检查Cookie是否存在

Aci*_*dic 44 c# asp.net cookies webforms asp.net-4.0

通过快速搜索Stack Overflow,我看到人们建议使用以下方法检查cookie是否存在:

HttpContext.Current.Response.Cookies["cookie_name"] != null
Run Code Online (Sandbox Code Playgroud)

或(在Page课堂内):

this.Response.Cookies["cookie_name"] != null
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用索引器(或Cookies.Get方法)来检索不存在的cookie时,似乎实际上创建了一个具有该名称的"默认"cookie并返回该cookie,因此无论我使用什么cookie名称它永远不会返回null.(更糟糕的是 - 创建一个不需要的cookie)

我在这里做错了什么,或者是否有一种不同的方式来简单地通过名称检查特定cookie的存在?

mar*_*sks 50

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

HttpContext.Current.Response.Cookies.AllKeys.Contains("myCookie")
Run Code Online (Sandbox Code Playgroud)

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

在我的情况下,我不得不在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
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您需要检查响应中生成的cookie,这是正确的答案. (2认同)
  • 如果你的`AllKeys`集合不包含`Contains`函数,你可以包含LINQ(`using System.Linq`). (2认同)

Tre*_*vor 39

这里有很多正确的答案取决于你想要完成的事情; 这是我尝试提供全面的答案:

无论是RequestResponse对象包含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.


Ale*_*kov 35

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

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

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

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

  • 是的,并且使用"旁注:"仅对新cookie进行复制.如果您在响应中更新cookie,则如果cookie已在请求中,则不会更新请求.如果您有一个框架可以在同一个请求中多次修改cookie,那么这可能会令人头疼. (6认同)

zmb*_*mbq 30

Response.Cookies包含将发送回浏览器的cookie.如果你想知道cookie是否存在,你应该考虑一下Request.Cookies.

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

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

  • "Cookies.Get(string)"的链接文档中的注释表示"如果指定的cookie不存在,则此方法将创建一个具有该名称的新cookie." (16认同)
  • 使用`Request`代替`Response似乎`以我想要的方式工作.谢谢(*两个答案几乎相同,但你先回答*) (3认同)
  • 为什么假设OP不想知道响应cookie是否存在?也许他们想知道cookie是否已经添加到响应中.Get在问题的上下文中不起作用. (3认同)
  • @MichaelPetito虽然文档说,我发现如果找不到它会返回null.我相信创建(如果不存在)仅适用于使用响应时.如果Request.Cookies然后Get返回null.您现在可以看到有关该文档的一些用户评论. (2认同)