Cookie总是过期的

时间:2009-04-09 20:33:36

标签: c# cookies

我正在设置一个cookie:

HttpCookie cookie = new HttpCookie("simpleorder");
cookie.Expires = DateTime.Now.AddYears(1);
cookie["order"] = carModel.ToString();
cookie["price"] = price.ToString();
Response.Cookies.Add(cookie);

但是当我几秒钟检查它时它已经过期,并且到期日期设置为{01-01-0001 00:00:00}。我尝试通过

检索代码
 HttpCookie cookie = Request.Cookies["simpleorder"];
 if (cookie != null && cookie.Expires > DateTime.Now)...

我没有在任何地方清除cookie,所以我不知道为什么会过期?

2 个答案:

答案 0 :(得分:19)

这是常见的误解。请求cookie集合表示请求cookie标头中包含的cookie。此类cookie不包含任何有关何时到期的信息。严格来说,.NET应该使用两种不同的类型(RequestCookie和ResponseCookie),而是选择在两种情况下使用相同的类型。

Expires值仅在向响应中添加Cookie时才有意义。

答案 1 :(得分:2)

起初我还对请求cookie没有Expires值感到失望,但在使用Fiddler2进行调试后,我知道http协议不包含请求cookie的任何Expires值。 .NET Framework无法为请求cookie公开Expires值。

如果您在应用和浏览器之间使用Fiddler,则可以看到响应cookie已正确发送到具有所有属性的浏览器。但是,http标头中的请求cookie没有expires值,它只公开cookie名称和值。浏览器需要发送此请求标头,如http标准中所指定。之所以可以最小化大小和Web服务器,则不需要检查除值之外的任何内容。

因此,您无需检查Web请求上的expires值,因为它是您在某些早期Web响应中设置的值。如果您收到cookie,则表示cookie尚未过期。设置expires值后,浏览器将处理到期日期。如果要更改过期,只需在响应中设置新值。