Реализация файлов cookie ASP.NET MVC

Я пытаюсь реализовать базовый помощник 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;
    }
}

если сеанс нулевой, я пытаюсь получить из файла 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);
}

person gandil    schedule 23.07.2011    source источник
comment
Ваш код выглядит хорошо для меня. Можете ли вы опубликовать код, где вы его вызываете?   -  person Kirk Woll    schedule 23.07.2011
comment
Где находится этот новый фрагмент (if (userId == 0))? Куда вы положили этот код? Какой метод контроллера и т.д.? Кроме того, почему вы используете CookieHelper ниже и MyCookie выше? И почему один метод GetCookie возвращает HttpCookie, а когда вы вызываете другой метод GetCookie, он возвращает User. Я совсем запутался.   -  person Kirk Woll    schedule 23.07.2011
comment
Я всегда инициализирую сеанс в базовом контроллере. Если пользователь не вошел в систему, я устанавливаю сеанс с идентификатором пользователя 0. На самом деле оба они являются MyCookie. Но поскольку я редактирую вопрос, мой код изменяется. Потому что я что-то пробую, пока жду ответа от stackoverflow.   -  person gandil    schedule 23.07.2011


Ответы (3)


Вы не можете установить и получить файл cookie в одном и том же запросе. Получение файла cookie получает его из браузера, но он еще не получил его. Установка файла cookie подготавливает его к отправке обратно как часть заголовка после завершения запроса.

Вам нужно установить файл cookie и заставить браузер, возможно, перенаправить куда-то еще (например, с /login на /account), тогда при чтении нового запроса он правильно отобразит файл cookie.

РЕДАКТИРОВАТЬ: В случае, если это предположение было неверным, я бы также спросил, где вы на самом деле вызываете .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 в том же запросе и терпит неудачу (как я первоначально сказал)

В любом случае удачи!

person White Dragon    schedule 25.07.2011
comment
Соглашаться! Вы можете прочитать cookie только после того, как браузер ОТПРАВИЛ запрос. Я был жертвой такой проблемы ... но я понял через минуту :) .. Я пришел из школы PHP 1999 года :) - person effkay; 30.07.2011

Моя рабочая реализация (базовая версия)

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);
 }
 }

если сеанс/куки нулевой (на самом деле 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);
        }
    }
}
person gandil    schedule 29.07.2011

Попробуй это

HttpCookie cookie = new HttpCookie("Remember_Me");
cookie["userID"] = Userid.ToString();
cookie.Expires = DateTime.Now.AddMonths(3);
Response.Cookies.Add(cookie);
person isanka thalagala    schedule 04.07.2017