我有一个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。
答案 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=/");
其中context
为HttpListenerContext
。
这似乎是使用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");