Содержание
HTTP-запросы представляют собой независимые сообщения, которые не сохраняют пользовательских значений. Это означает, что как только запрос обработан, то все данные запроса (состояние) удаляются. Вместе с этим, компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами (например, «куки» на стороне клиента, «сессии» на стороне сервера). В ASP.NET Core мы можем сохранять данные запроса различными способами. И сегодня мы рассмотрим один из наиболее простых вариантов сохранения данных запроса — использование свойства HttpContext.Items.
HttpContext.Items
Свойство HttpContext.Items мы уже кратко рассматривали. Это свойство представляет собой словарь Dictionary<object, object?> в котором можно хранить данные непосредственно связанные с запросом. Это свойство удобно использовать в том случае, если конвейер обработки запросов ASP.NET Core состоит из множества различных компонентов и данные, полученные в одном middleware требуются для работы в другом. Например,
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
context.Items.Add("Count", 1);
await next();
});
app.Use(async (context, next) =>
{
context.Items["Count"] = (int)context.Items["Count"]+1;
await next();
});
app.MapGet("/", async (context) =>
{
int data = (int)context.Items["Count"]+1;
await context.Response.WriteAsync($"Count = {data}");
});
app.Run();
}
}
Здесь в первом компоненте конвейера задается некое значение Count и записывается в свойство HttpContext.Items. Проходя по конвейеру это значение каждый раз увеличивается на единицу и в конце — выводится пользователю:
Что касается методов, которые предоставляет свойство HttpContext.Items, то это ровно те же методы, что и у обычного словаря Dictionary. Посмотреть описание этих методов можно, например, в учебнике по C#.
Итого
Свойство HttpContext.Items хранит данные, относящиеся к запросу в виде пар «ключ-значение». После обработки запроса все данные из свойства удаляются. HttpContext.Items удобно использовать в том случае, если конвейер обработки запросов состоит из множества компонентов и данные одного middleware требуются для работы в другом.
