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