Реализация Cookie ASP.NET MVC
Я пытаюсь реализовать базовый помощник cookie в своем приложении.
В основном я проверяю базовый контроллер каждый раз, независимо от того, установлен ли cookie или нет.
Если cookie
public class MyCookie
{
public static string CookieName {get;set;}
public virtual User User { get; set; }
public virtual Application App { get; set; }
public MyCookie(Application app)
{
CookieName = "MyCookie" + app;
App = app;
}
public void SetCookie(User user)
{
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = user.UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
public HttpCookie GetCookie()
{
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName];
if(myCookie != null)
{
int userId = Convert.ToInt32(myCookie.Values["UserId"]);
User user = session.Get<User>(userId);
return user;
}
return null;
}
}
если session is null Я пытаюсь получить из файла cookie или если инициализация сессии я устанавливаю cookie, но я никогда не вижу свой файл cookie в браузере. Что не так?
Я всегда начинаю сеанс, но с userId = 0
Чтобы получить cookie и установить сеанс из файла cookie:
if (userId == 0)
{
MyCookie myCookie = new MyCookie(_app);
User user = cookieHelper.GetCookie();
if (user != null)
SessionHelper.SetSession(user);
}
Ответы
Ответ 1
Моя рабочая реализация (основная версия)
public class CookieHelper
{
public static string CookieName {get;set;}
public virtual Application App { get; set; }
public MyCookie(Application app)
{
CookieName = "MyCookie" + app;
}
public static void SetCookie(User user, Community community, int cookieExpireDate = 30)
{
HttpCookie myCookie= new HttpCookie(CookieName);
myCookie["UserId"] = user.UserId.ToString();
myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate);
HttpContext.Current.Response.Cookies.Add(myCookie);
}
}
если session/cookie имеет значение null (фактически userid = 0)
if (userId == 0){
CookieHelper myCookie = new Cookie(_app);
if (myCookie != null)
{
userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]);
if(userId>0)
{
SessionHelper.SetSession(userId);
}
}
}
Ответ 2
Вы не можете установить и получить файл cookie в том же запросе. Получение cookie получает его из браузера, и он еще не получил его. Настройка cookie позволяет его отправить обратно как часть заголовка, когда запрос завершен.
Вам нужно установить cookie и, возможно, перенаправить браузер в другое место (например, из /login to/account), а затем при новом запросе, читающем его, будет корректно отображаться файл cookie.
EDIT:
Если бы это было неправильно, я бы также задал вопрос, где вы на самом деле вызываете .SetCookie(), как нигде в коде, который вы предоставили, вы на самом деле вызываете его, чтобы создать файл cookie в первую очередь.
Чтобы отладить эти вещи, я считаю, что нужно принимать биты кода, который вы предполагаете, должны работать, протестировать их. Например, в page_load новой страницы я ввел это:
string CookieName = "bob";
long UserId = 4;
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName);
myCookie.Values["UserId"] = UserId.ToString();
myCookie.Values["LastVisit"] = DateTime.Now.ToString();
myCookie.Expires = DateTime.Now.AddDays(365);
HttpContext.Current.Response.Cookies.Add(myCookie);
И файл cookie появился правильно без проблем. Поэтому, зная, что этот код действительно работает, мы можем предположить, что ошибка - это функция, которая не вызывается, или тестирование/отладка, которую вы сейчас выполняете, пытается установить и прочитать файл cookie в том же запросе и сбой (как я изначально заявил)
В любом случае удачи!
Ответ 3
Попробуйте это
HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);