Содержание
Самым известным способом хранения данных пользователя является установление cookies. Куки хранятся на компьютере пользователя и могут устанавливаться как на сервере, так и на клиенте. Но, так как куки посылаются с каждым запросом на сервер, то их максимальный размер ограничен 4096 байтами и при их использовании строит особое внимание обращать на их размер. Сегодня мы рассмотрим основные моменты по работе с куками в ASP.NET Core.
Получить доступ к кукам в ASP.NET Core можно, используя объект HttpContext
.
Для установки куки на компьютере пользователя мы должны воспользоваться свойством 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
, которое означает, что срок действия куки истекает через одну минуту.
Чтобы протестировать работу нашего приложения с куками вначале разберемся с тем, как получать куки от пользователя.
Чтобы получить куки от пользователя мы должны использовать свойство 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
Рассмотрим следующий пример
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
.