C # HttpListener Cookies истекает после сеанса, хотя время истечения установлено - PullRequest
5 голосов
/ 27 января 2011

У меня есть класс HttpListener для обработки входов на страницу, и я могу успешно установить cookie, но срок действия cookie истекает в конце сеанса (с использованием расширения cookie в Chrome, показано, что 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 ]

5 голосов
/ 27 января 2011

Как правило, свойство коллекции cookie (Cookies) доступно только для чтения (по крайней мере, при использовании свойства ASP.NET Response.Cookies).

Давно я не использовал HttpListener,Итак, знаете ли вы, является ли коллекция Cookies нулевой, до назначения вашей собственной коллекции cookie?Если нет, можете ли вы попробовать просто добавить cookie, а не коллекцию cookie?

Редактировать:

Я создал тестовый веб-сервер, используя HttpListener, и это то, что янайденный.Когда вы устанавливаете cookie, заголовок http выглядит следующим образом:

Set-Cookie: username = shiv

, тогда как в действительности он должен выглядеть примерно так:

Set-Cookie: username = shiv;истекает = чт, 27 января 2011 г. 00:45:41 GMT;путь = /

Так на данный момент это похоже на ошибку?Я буду копать глубже и дам вам знать ...

Изменить 2:

Хорошо, время файлов cookie Expiration должно быть установлено как время по Гринвичу.ASP.NET берет это на себя за вас, но в этом случае вам придется использовать правильный формат самостоятельно.

Ручная настройка заголовка Http работает как положено:

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

гдеcontext - это HttpListenerContext.

Кажется, что это единственный способ установить (не сеансовый) cookie с использованием HttpListener.Вы можете использовать эту строку формата DateTime для правильного форматирования даты, если вы идете по маршруту, который я предложил:

var cookieDate = DateTime.UtcNow.AddMinutes(60d).ToString("dddd, dd-MM-yyyy hh:mm:ss GMT");
2 голосов
/ 28 января 2011

Решил это, выполнив следующее:

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