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

Mik*_*e J 5 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;
Run Code Online (Sandbox Code Playgroud)

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

Shi*_*mar 5

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

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

编辑:

我使用了一个测试网络服务器HttpListener,这就是我发现的.设置cookie时,http标头如下所示:

Set-Cookie:用户名= shiv

而它应该是这样的:

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

那么目前它看起来像一个bug?我会深入挖掘并让你知道......

编辑2:

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

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

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

哪里contextHttpListenerContext.

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

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