Куки

Последнее обновление: 23.12.2021

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

Для работы с куками также можно использовать контекст запроса HttpContext, который передается в качестве параметра в компоненты middleware, а также доступен в контроллерах и RazorPages.

Чтобы получить куки, которые приходят вместе с запросом к приложению, нам надо использовать коллекцию Request.Cookies объекта HttpContext. Эта коллекция представляет объект IRequestCookieCollection, в котором каждый элемент - это объект KeyValuePair<string, string>, то есть некоторую пару ключ-значение.

Для этой коллекции определено несколько методов:

  • bool ContainsKey(string key): возвращает true, если в коллекции кук есть куки с ключом key

  • bool TryGetValue(string key, out string value): возвращает true, если удалось получить значение куки с ключом key в переменную value

Стоит отметить, что куки - это строковые значения. Неважно, что вы пытаетесь сохранить в куки - все это необходимо приводить к строке и соответственно получаете из кук вы тоже строки.

Например, получим куку "name":

if (context.Request.Cookies.ContainsKey("name"))
	string name = context.Request.Cookies["name"];

Повторюсь, что коллекция context.Request.Cookies служит только для получения значений кук.

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

  • Append(string key, string value): добавляет для куки с ключом key значение value

  • Delete(string key): удаляет куку по ключу

Например, объединим в приложении установку и получение кук:

var builder = WebApplication.CreateBuilder();
var app = builder.Build();

app.Run(async (context) =>
{
    if (context.Request.Cookies.ContainsKey("name"))
    {
        string? name = context.Request.Cookies["name"];
        await context.Response.WriteAsync($"Hello {name}!");
    }
    else
    {
        context.Response.Cookies.Append("name", "Tom");
        await context.Response.WriteAsync("Hello World!");
    }
});

app.Run();

При получении запроса мы смотрим, установлена ли кука "name":

if (context.Request.Cookies.ContainsKey("name"))

Если кука не установлена (например, при первом обращении к приложению), то устанавливаем ее и отправляем пользователю в ответ строку "Hello World!".

context.Response.Cookies.Append("name", "Tom");
await context.Response.WriteAsync("Hello World!");

Если кука установлена, то получаем ее значение и отправляем его пользователю

string? name = context.Request.Cookies["name"];
await context.Response.WriteAsync($"Hello {name}!");
Куки в ASP.NET Core и C#

После установки кук в результате первого запроса в браузере будет установлена кука name. И через средства разработчика в веб-браузере мы сможем увидеть ее значение (если браузер поддерживает подобное). Например, в Google Chrome посмотреть куки можно на вкладке Application -> Cookies:

Установка и получение cookie куки в ASP.NET Core и C#

В примере выше мы также могли бы применить метод TryGetValue() для получения кук:

app.Run(async (context) =>
{
    if (context.Request.Cookies.TryGetValue("name", out var login))
    {
        await context.Response.WriteAsync($"Hello {login}!");
    }
    else
    {
        context.Response.Cookies.Append("name", "Tom");
        await context.Response.WriteAsync("Hello World!");
    }
});

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850