Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
Часть данных, используемых в приложении, можно отнести к его состоянию. Это могут быть как какие-то глобальные данные, так и данные, которые непосредственно относятся к запросу и пользователю. И в зависимости от вида данных, существуют различные способы для их хранения.
В объекте 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("Случайный текст"); }); }