即使设置了到期时间,C#HttpListener Cookie也会在会话后到期

时间:2011-01-26 22:49:11

标签: c# cookies httplistener

我有一个HttpListener类用于处理页面登录,并且可以成功设置cookie,但cookie在会话结束时到期(在Chrome中使用cookie扩展,显示cookie是会话cookie )。以下是代码段:

CookieCollection ccol = new CookieCollection();    
Cookie loginCookie = new Cookie();

loginCookie.Name = "login";
loginCookie.Value = "loggedin";
loginCookie.Expires = DateTime.Now.AddMinutes(60);
ccol.Add(loginCookie);
context.Response.Cookies = ccol;

只要我在同一个会话中,我就可以毫无问题地访问cookie。

2 个答案:

答案 0 :(得分:5)

通常,cookie集合(Cookies)属性是只读的(至少在使用ASP.NET Response.Cookies属性时)。

我使用HttpListener已经有一段时间了,所以在分配自己的cookie集合之前,你知道Cookies集合是否为空吗?如果没有,您可以尝试简单地添加cookie而不是cookie集合吗?

修改

我使用HttpListener构建了一个测试网络服务器,这就是我找到的。 设置cookie时,http标头如下所示:

  

Set-Cookie:username = shiv

虽然它应该是这样的:

  

Set-Cookie:username = shiv;   expires =星期四,2011年1月27日00:45:41 GMT;   路径= /

所以目前看起来像个臭虫?我会深入挖掘并让你知道......

编辑2:

好的,Cookie的Expiration时间需要设置为GMT时间。 ASP.NET会为您提供此功能,但在这种情况下,您必须自己使用正确的格式。

手动设置Http Header按预期工作:

context.Response.Headers.Add("Set-Cookie", 
"username=shiv; expires=Thu, 27-Jan-2011 00:45:41 GMT; path=/");

其中contextHttpListenerContext

这似乎是使用HttpListener设置(非会话)cookie的唯一方法。如果沿着我建议的路线前进,您可以使用此DateTime格式字符串正确格式化日期:

var cookieDate = DateTime.UtcNow.AddMinutes(60d).ToString("dddd, dd-MM-yyyy hh:mm:ss GMT");

答案 1 :(得分:2)

通过执行以下操作解决了这个问题:

string cookieDate = DateTime.UtcNow.AddMinutes(60).ToString("ddd, dd-MMM-yyyy H:mm:ss");

context.Response.Headers.Add("Set-Cookie", "cookieName=cookieValue;Path=/;Expires=" + cookieDate + " GMT");