【问题标题】:Cookies expiration not working in C#Cookie 过期在 C# 中不起作用
【发布时间】:2012-01-23 15:00:07
【问题描述】:

我正在尝试使用 C# 4.0 和以下代码制作持久 cookie:

HttpCookie AssoCookie = new HttpCookie("AssociateCode", AssociateCode);
AssoCookie.Expires = DateTime.Now.AddMonths(6);
HttpContext.Current.Response.Cookies.Add(AssoCookie);

很遗憾,它不起作用,并且 cookie 正在会话到期。如果我在 Firefox 中使用 Web Developer 插件来检查它,我可以看到以下信息:

Name    AssociateCode
Value   test
Host    localhost
Path    /
Secure  No
Expires At End Of Session

我正在做的 cookie 只是在那里创建的,没有其他人管理或编辑它,因此它不能被覆盖。我在 webconfig 中没有设置任何设置 cookie 过期时间(无论如何这应该覆盖它),如果我设置了一些 cookie 过期时间它不起作用。

我现在有点迷路了,每本手册、教程、博客,无论我检查什么,你只需要设置到期日期,我已经调试过,我已经检查过它在创建时和 Page_PreRender 结束时确实具有该值但无论我做什么,它都会随着会话到期。

有什么想法吗?

我正在使用 Firefox 9.0.1 顺便说一句。

更新

在 Firefox 中使用 Firebug 插件检查响应头我得到了这个:

Response Headersview source
Cache-Control   private
Connection  Close
Content-Length  21322
Content-Type    text/html; charset=utf-8
Date    Mon, 23 Jan 2012 16:47:08 GMT
Server  ASP.NET Development Server/10.0.0.0
Set-Cookie  AssociateCode=test; expires=Mon, 23-Jul-2012 16:09:04 GMT; path=/
X-AspNet-Version    4.0.30319

使用 Fiddler 我得到了这个:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Set-Cookie: AssociateCode=; expires=Mon, 23-Jul-2012 16:27:29 GMT; path=/
X-Powered-By: ASP.NET
Date: Mon, 23 Jan 2012 17:27:29 GMT
Content-Length: 21313

** 更新 2 ** 我检查 Cookie 不存在只是检查我的 Firefox 的 cookie,但是,如果你想看看我以后如何在代码中得到它(没有必要,因为它不在那里):

try {
    AssociateCode = HttpContext.Current.Request.Cookies.Get("AssociateCode").Value;
} catch { }

【问题讨论】:

  • 您确定 cookie 本身即将到期,还是由于会话的行为方式而导致其似乎即将到期?在调试期间会话到期后,cookie 是否物理上不再附加到请求?
  • 如果我关闭浏览器窗口并再次打开它,cookie 就会消失。这发生在没有向页面请求任何内容的情况下。所以它的到期日期确实是“会话结束”。
  • 我测试过没有问题。即使在关闭它并再次打开它之后,浏览器也会记住 cookie。我建议使用 Fiddler 仔细检查 cookie 是否真的被发送到具有正确过期标头的浏览器,并且浏览器在关闭/重新打开后正确地将其发送回网站。
  • Fiddler 是一个实用程序,可以记录所有进出您的公司的流量。它允许您准确查看从您的网页发送和接收的内容。安装它并运行您的页面,您将能够看到发送的内容。
  • 我感觉您正在错误地测试 cookie 的存在。您可以发布显示您没有代码的代码吗?阅读:britishdeveloper.co.uk/2011/02/…

标签: c# .net cookies


【解决方案1】:

您是否尝试过使用 SetCookie 函数而不是 Add?

HttpCookie cookie = new HttpCookie("test");
cookie.Expires = DateTime.Now.AddHours(10);
HttpContext.Current.Response.SetCookie(cookie);

刚刚快速测试了一下,它对我有用。

【讨论】:

  • 不错的尝试,我检查过它并不起作用。它必须是某种类型的 IIS 配置或我缺少的东西。有人至少可以确认我这应该有效吗?我现在开始怀疑了……
  • 是的,这应该可以。您能否发布 HTTP 响应(Set-Cookie 标头),以便我们准确查看服务器发出的内容?
  • SetCookie 未定义,您的意思是使用 Set 而不是 SetCookie?
【解决方案2】:

只是为了跟进我的评论:

来自 fiddler 和 firefox 工具的信息表明您正在发送正确的信息来创建 cookie。

这让我相信你错误地测试了它的存在。

在测试是否将 cookie 传递给您的应用程序时,您应该使用 Request.Cookies 容器来查看它是否存在。 (请注意,它是 REQUEST 而不是 RESPONSE)。

如果您使用以下方式进行测试:

if (Response.Cookies["mycookie"] == null) { .. }

然后这将导致在响应对象中创建一个新的 cookie,它是空白的。

总结一下:Request 对象将包含从浏览器发送的所有内容。 Response 对象是您发送到浏览器的所有内容。

【讨论】:

  • 是的,这是一个不错的提示,它有时会发生。但我知道请求和响应之间的区别,但事实并非如此。其实我只需要关闭再打开窗口,在Firefox的Cookies中搜索cookie就消失了,或者使用Web Developer插件,它不存在。所以,我什至不需要使用 .Net 检查它是否存在,如果我这样做了,我当然会使用 Request 而不是。 ||例如:尝试 { AssociateCode = Current.Request.Cookies.Get("AssociateCode").Value; } 捕捉 { }
【解决方案3】:

大家好。很抱歉,但似乎出于某种原因,我之前已将浏览器配置为在关闭窗口时删除 cookie,因此,尽管 cookie 被正确创建,但浏览器将它们设置为会话 cookie,不是因为它们是,而是因为浏览器选项。

事实上,如果我在 Firefox 中管理 Cookie,我可以取消选中 cookie 中的“会话 Cookie”选项,然后过期日期是正确的,但由于某种原因,默认选中了检查选项。我认为也许有一种方法可以设置 Cookie 是否为 Session Cookie,或者 .Net 在我意识到这一点之前正在做某事。

好吧,当任何逻辑似乎都不起作用时,你就知道问题是你能想象到的最愚蠢的事情......

再次抱歉。

【讨论】:

  • 对我来说没问题,我有同样的错误,现在我可以尝试这些解决方案,谢谢
猜你喜欢
  • 2018-03-28
  • 1970-01-01
  • 2017-11-10
  • 2019-09-06
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 2011-11-14
相关资源
最近更新 更多