为什么cookie的到期日期不能在ASP.NET中的会话中存活?

时间:2014-01-29 19:48:58

标签: asp.net cookies

我对testbed页面进行了一些更改,所以我可以在这里更清楚地说明问题。

该页面有三个按钮:Set;明确;得到。

设置有以下代码:

PreferredCookie = new HttpCookie("PreferredCookie");
PreferredCookie.Value = "Chocolate Chip";
DateTime exp = DateTime.Now.AddDays(1.0d);
PreferredCookie.Expires = exp;
Response.Cookies.Set(PreferredCookie);

清除有这个:

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    PreferredCookie.Value = "";
    PreferredCookie.Expires = DateTime.Now;
    Response.Cookies.Set(PreferredCookie);
}

获取有这个,输出到asp:Literal:

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    CookieLiteral.Text = "Value = " + PreferredCookie.Value + "<br>";
    CookieLiteral.Text += "Expires = " + PreferredCookie.Expires.ToString("MM/dd/yyyy HH:mm:ss");
}
else
{
    CookieLiteral.Text = "<h2>No Cookie?</h2>";
}

如果我启动页面并单击“清除”,然后使用“获取”进行跟进,我会看到:

  

没有Cookie?

如果我然后点击Set,那么Get,我看到:

  

价值=巧克力片
  Expires = 01/01/0001 00:00:00

此日期似乎被视为永不过期。如果我使用Firefox访问该页面,我会得到相同的结果。

1 个答案:

答案 0 :(得分:14)

简答 - 您无法阅读Cookie的到期日期和时间。

稍微长一点的答案 - 这不是ASP.NET中的会话问题。这是您可以从ASP.NET中的cookie服务器端读取的问题。 Per the MSDN

  

浏览器负责管理cookie和cookie   到期时间和日期有助于浏览器管理其cookie存储。   因此,虽然您可以阅读cookie的名称和价值,但您   无法读取Cookie的到期日期和时间。当浏览器   将cookie信息发送到服务器,浏览器不包括   到期信息。 (cookie的Expires属性总是如此   返回日期时间值为零。)

     

您可以阅读已在中设置的Cookie的Expires属性   HttpResponse对象,在cookie发送到浏览器之前。   但是,您无法在HttpRequest对象中返回到期日期。

基本上,cookie的到期日期设置正确。这可以通过检查浏览器中的cookie来验证。不幸的是,像获取功能一样阅读此Cookie将返回1/1/0001。

如果你真的想要过期,那么你必须将它存储在cookie本身中:

设置

DateTime exp = DateTime.Now.AddDays(1);
HttpCookie PreferredCookie = new HttpCookie("PreferredCookie");
PreferredCookie.Values.Add("cookieType", "Zref");
PreferredCookie.Values.Add("exp", exp.ToString());
PreferredCookie.Expires = exp;
Response.Cookies.Set(PreferredCookie);

获取

HttpCookie PreferredCookie = Request.Cookies["PreferredCookie"];
if (PreferredCookie != null)
{
    CookieLiteral.Text = "Value = " + PreferredCookie["cookieType"] + "<br>";
    CookieLiteral.Text += "Expires = " + PreferredCookie["exp"];
}
else
{
    CookieLiteral.Text = "No Cookie";
}