Управление состоянием в ASP.NET Core. Cookies (куки)

Самым известным способом хранения данных пользователя является установление cookies. Куки хранятся на компьютере пользователя и могут устанавливаться как на сервере, так и на клиенте. Но, так как куки посылаются с каждым запросом на сервер, то их максимальный размер ограничен 4096 байтами и при их использовании строит особое внимание обращать на их размер. Сегодня мы рассмотрим основные моменты по работе с куками в ASP.NET Core.

Получить доступ к кукам в ASP.NET Core можно, используя объект HttpContext.

Установка cookies на компьютере клиента. IResponseCookies

Для установки куки на компьютере пользователя мы должны воспользоваться свойством HttpContext.Response.Cookies. Это свойство представляет собой объект, реализующий интерфейс IResponseCookies и содержит следующие методы:

void Append(string key, string value);
void Delete(string key);

Первый метод добавляет куку, второй — удаляет. Стоит отметить, что куки — это всегда строковые значения. Например, установим куку:

app.Use(async (context, next) => 
{
    context.Response.Cookies.Append("start", DateTime.Now.ToShortDateString());
    await next();
});

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

context.Response.Cookies.Append("start", DateTime.Now.ToShortDateString(), 
     new CookieOptions() 
       { 
         Expires = DateTimeOffset.Now.AddMinutes(1)
       });
 await next();

здесь в третьем параметре метода мы передали объект типа CookieOptions в котором установили свойство Expires, которое означает, что срок действия куки истекает через одну минуту.

Чтобы протестировать работу нашего приложения с куками вначале разберемся с тем, как получать куки от пользователя.

Получение cookies. IRequestCookieCollection

Чтобы получить куки от пользователя мы должны использовать свойство HttpContext.Request.Cookies. Это свойство представляет собой объект, реализующий интерфейс IRequestCookieCollection и содержит следующие методы работы с куками:

bool ContainsKey(string key);
bool TryGetValue(string key, [NotNullWhen(true)] out string? value);

а также индексатор:

string? this[string key] { get; }

Например, получим ранее установленную куку:

if (context.Request.Cookies.TryGetValue("start", out string? cookie))
    await context.Response.WriteAsync($"Start = {cookie}");

Теперь рассмотрим небольшой пример работы с куками в ASP.NET Core

Пример работы с cookies в ASP.NET Core

Рассмотрим следующий пример

   public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);
        var app = builder.Build();

        app.Use(async (context, next) => 
        {
            //устанавливаем куки
            context.Response.Cookies.Append("short_cookie", DateTime.Now.ToShortDateString(), 
                new CookieOptions() 
                  { 
                    Expires = DateTimeOffset.Now.AddMinutes(1)
                  });

            context.Response.Cookies.Append("message", "ASP.NET Core cookie test");
            await next();
        });

        app.MapGet("/", async (context) => 
        {
            if (context.Request.Cookies.TryGetValue("short_cookie", out string? cookie))
               await context.Response.WriteAsync($"Cookie value = {cookie} \n");
            else
                await context.Response.WriteAsync("Short cookie not found \n");

            if (context.Request.Cookies.TryGetValue("message", out string? message))
                await context.Response.WriteAsync($"Message: {message}");
            else
                await context.Response.WriteAsync($"Message not found");
        });

        app.Run();
    }
}

В этом примере мы устанавливаем на компьютер пользователя две куки:

первая — со сроком действия в 1 минуту

context.Response.Cookies.Append("short_cookie", DateTime.Now.ToShortDateString(), 
new CookieOptions() 
  { 
    Expires = DateTimeOffset.Now.AddMinutes(1)
  });

вторая — бессрочная

context.Response.Cookies.Append("message", "ASP.NET Core cookie test");

В конечной точке мы пробуем получить куки из запроса и вывести их значения пользователю или сообщить о том, что кука не найдена.

 app.MapGet("/", async (context) => 
{
    if (context.Request.Cookies.TryGetValue("short_cookie", out string? cookie))
       await context.Response.WriteAsync($"Cookie value = {cookie} \n");
    else
        await context.Response.WriteAsync("Short cookie not found \n");

    if (context.Request.Cookies.TryGetValue("message", out string? message))
        await context.Response.WriteAsync($"Message: {message}");
    else
        await context.Response.WriteAsync($"Message not found");
});

Теперь запустим приложение. При запуске мы увидим, что обе куки не были найдены:

куки были установлены в текущем ответе пользователю и, поэтому, мы их пока не получили. Теперь обновим страницу:

Обе куки пришли с запросом. Теперь подождите минуту и попробуйте снова обновить страничку — кука с истекшим сроком не вернется

Так как куки сохраняются на компьютере пользователя, то можете закрыть приложение, затем снова запустить и убедиться, что куки были сохранены, так как сразу после повторного запуска приложения обе куки вернутся в запросе.

Где смотреть куки в браузере

Все современные браузеры содержат инструменты разработчика. Куки можно посмотреть в разделе приложения. Например, в браузере Edge, который запускается по умолчанию при отладке приложений ASP.NET Core куки можно посмотреть здесь:

Итого

Самым известным способом хранения данных пользователя является установление cookies. Для установки куки на компьютер пользователя необходимо использовать свойство HttpContext.Response.Cookies, а для чтения — свойство HttpContext.Request.Cookie. Cookies — это всегда строковые значения, поэтому, что бы мы не пытались сохранить в куке — это должно быть приведено к типу string.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии