ASP MVC Cookies不会持久化

56

我有一个ASP MVC应用程序,其中包含一些看似简单的代码来保存和检索cookie,但由于某种原因它们无法持久化。控制器中的代码如下:

if (System.Web.HttpContext.Current.Response.Cookies["CountryPreference"] == null)
{
    HttpCookie cookie = new HttpCookie("CountryPreference");
    cookie.Value = country;
    cookie.Expires = DateTime.Now.AddYears(1);
    System.Web.HttpContext.Current.Response.Cookies.Add(cookie);
}

再次加载它的方法:

if (System.Web.HttpContext.Current.Request.Cookies["CountryPreference"] != null)
{
    System.Web.HttpContext.Current.Request.Cookies["CountryPreference"].Expires = DateTime.Now.AddYears(1);
    data.Country = System.Web.HttpContext.Current.Request.Cookies["CountryPreference"].Value;
}

出于某些原因,Cookie 总是 null?


当您使用FireBug或类似工具检查请求和响应时,Cookie是否存在? - Charlino
2个回答

98

问题出在以下代码:

if (System.Web.HttpContext.Current.Response.Cookies["CountryPreference"] == null)

当您尝试使用 Response 对象而不是 Request 来检查 cookie 的存在时,ASP.net 会自动创建一个 cookie。

请在此处查看详细帖子:http://chwe.at/blog/post/2009/01/26/Done28099t-use-ResponseCookiesstring-to-check-if-a-cookie-exists!.aspx


如果链接再次失效,请引用文章中的内容....

简短的解释,如果您不想阅读整个故事

如果您使用类似于“if(Response.Cookies[“mycookie”] != null) { … }”的代码,ASP.Net会在后台自动生成一个名为“mycookie”的新cookie并覆盖您的旧cookie!请始终使用Request.Cookies集合来读取cookie!

[ 文章中有更多详细信息 ]


9
我很久之前曾点赞过这个,但我必须说这是微软在.NET中所做的最愚蠢的API决定之一。 - Chris Marisic
2
我遇到了同样的问题,而且我只使用请求来读取cookies。 https://dev59.com/GlvUa4cB1Zd3GeqPuITT - eran otzap
2
我知道在创建cookie时应该使用响应(response)而不是请求(request),但由于某些原因,在获取它时,我必须复制并粘贴并将其留作为响应(response) - 所以我的cookie不能持久化超过第一次页面加载。谢谢这个提示! - Losbear
1
这种行为是否可以用于有意删除现有的cookie呢? - AbeyMarquez

2
在简历中,不要使用 "Response" 读取 cookie,请改为使用 "Request"。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接