Содержание
Самым известным способом хранения данных пользователя является установление 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.


