开发者

C# HttpListener Cookies expiring after session even though expiration time set

I have an HttpListener class for handling logins to a page, and can successfully set the cookie, but the cookie is expiring at the end of the session (using cookie extension in Chrome, shows cookie is a session cookie). Here is the code snippet:

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

loginCookie.Name = "login";
loginCookie.Value = "loggedin";
loginCookie.Expires = DateT开发者_StackOverflowime.Now.AddMinutes(60);
ccol.Add(loginCookie);
context.Response.Cookies = ccol;

As long as I am in the same session I can access the cookie without issue.


Normally, the cookie collection (Cookies) property is read only (at least when using the ASP.NET Response.Cookies property).

It's been a while since I used the HttpListener, so do you know if the Cookies collection is null prior to assigning your own cookie collection? If not, can you try simply adding a cookie rather than a cookie collection?

Edit:

I built a test webserver using HttpListener and this is what I found. When you set a cookie the http header looks like this:

Set-Cookie: username=shiv

whereas it should really be something like:

Set-Cookie: username=shiv; expires=Thu, 27-Jan-2011 00:45:41 GMT; path=/

So for the moment it looks like a bug? I'll dig deeper and let you know...

Edit 2:

Ok, the Expiration time of cookies needs to be set as GMT time. ASP.NET takes care of this for you, but in this case you'll have to use the proper format yourself.

Manually setting the Http Header works as expected:

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

where context is HttpListenerContext.

This seems to be the only way to set a (non session) cookie using the HttpListener. You can use this DateTime format string to format the date correctly if you go down the route I suggested:

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


Solved it by doing the following:

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");
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜