Состояние приложения. Куки. Сессии

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

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

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

HttpContext.Items

В объекте HttpContext определена коллекция Items, которая представляет собой словарь типа IDictionary<object, object>. Эта коллекция предназначена для таких данных, которые непосредственно связаны с текущим запросом. После завершения запроса все данные из HttpContext.Items удаляются. Каждый объект в этой коллекции имет ключ и значение. И с помощью ключей можно управлять объектами коллекции.

В каком случае мы можем применить данную коллекцию? Например, если у нас обработка запроса вовлекает множество компонентов middleware, и мы хотим, чтобы для этих компонентов были доступны общие данные, то как раз можем применить эту коллекцию. Например, пусть метод Configure в классе Startup будет определен следующим образом:

public void Configure(IApplicationBuilder app)
{
	app.Use(async (context, next) =>
    {
        context.Items["text"] = "Text from HttpContext.Items";
        await next.Invoke();
    });

    app.Run(async (context) =>
    {
		context.Response.ContentType = "text/html; charset=utf-8";
        await context.Response.WriteAsync($"Текст: {context.Items["text"]}");
    });
}

Здесь в одном middleware опредляется ключ "text" со значением "Text from HttpContext.Items":

context.Items["text"] = "Text from HttpContext.Items";

В другом middleware этот объект используется для установки отправляемого ответа.

Поскольку HttpContext.Items предоставляет ряд методов для управления элементами:

  • void Add(object key, object value): добавляет объект value с ключом key

  • void Clear(): удаляет все объекты

  • bool ContainsKey(object key): возвращает true, если словарь содержит объект с ключом key

  • bool Remove(object key): удаляет объект с ключом key, в случае удачного удаления возвращает true

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

Применение некоторых методов:

public void Configure(IApplicationBuilder app)
{     
	app.Use(async (context, next) =>
	{
		context.Items.Add("text", "Привет мир");
		await next.Invoke();
	});

	app.Run(async (context) =>
	{
		context.Response.ContentType = "text/html; charset=utf-8";
		if(context.Items.ContainsKey("text"))
			await context.Response.WriteAsync($"Текст: {context.Items["text"]}");
		else
			await context.Response.WriteAsync("Случайный текст");
	});
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850