TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #2249 2.73K
День 1860. #ЗаметкиНаПолях
Используем HttpContext.Items для Передачи Данных в
ASP.NET Core
HttpContext.Items — это словарь, к которому может получить доступ каждый компонент, участвующий в обработке HTTP-запроса. В отличие от HttpContext.Session, данные, сохранённые в HttpContext.Items, не сохраняются между запросами. Это изолирует данные и гарантирует, что они не будут мешать другим одновременным запросам.

В большинстве веб-приложений компонентам часто необходимо взаимодействовать друг с другом. Для этого должна быть организована передача параметров или общее состояние. Но это имеет определённые недостатки и проблемы: проблемы параллелизма, нарушение целостности данных, жёсткая связанность, издержки производительности и т. д.

HttpContext.Items позволяет промежуточному ПО, фильтрам и контроллерам обмениваться данными без прямой связи при их выполнении на разных этапах жизненного цикла запроса. Можно использовать любой тип данных для ключа. Однако, когда мы используем ключ строкового типа, мы рискуем столкнуться с коллизией ключей. Лучшая альтернатива — использовать объект в качестве ключа элемента.

Посмотрим, как использовать это в приложении веб-API ASP.NET Core.
1. Промежуточное ПО
public class CustomMW
{
private RequestDelegate _next;
public static readonly object MWKey = new();
public CustomMW(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext ctx)
{
ctx.Items[MWKey] = "MW";
await _next(ctx);
}
}

Мы создаём новый экземпляр объекта для ключа MWKey. В методе Invoke() устанавливаем значение в словаре HttpContext.Items.

В Program.cs используем наше промежуточное ПО:
…
app.UseMiddleware<CustomMiddleware>();
app.Run()


2. Фильтр
public class CustomFilter : IActionFilter
{
public static readonly object
FilterKey = new();
…
public void OnActionExecuting(
ActionExecutingContext ctx)
{
ctx.HttpContext.Items[FilterKey] = "Loading…";
…
}
public void OnActionExecuted(
ActionExecutedContext ctx) {
ctx.HttpContext.Items[FilterKey] = "Loaded.";
…
}
…
}

Зарегистрируем фильтр в сервисах:
builder.Services.AddScoped<CustomFilter>();


3. В контроллере
[ServiceFilter(typeof(CustomFilter))]
public IEnumerable<Item> Get()
{
HttpContext.Items.TryGetValue(
CustomMW.MWKey, out var mwValue);
…
}

Внутри метода контроллера мы используем TryGetValue() для получения значения, установленного в промежуточном ПО по ключу MWKey.

Итого
HttpContext.Items позволяет эффективно использовать данные между компонентами обработки запроса и автоматически удаляет сохранённые данные после завершения запроса.
Полный код примера на GitHub.

Источник: https://code-maze.com/aspnetcore-httpcontext-items-pass-data/
  • 👍 17
More from @netdeveloperdiary
  1. Oct 8, 2026День 2808. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Начало В ИТ есть се…
  2. Oct 7, 2026День 2807. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Окончание Нач…
  3. Oct 6, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  4. Oct 6, 2026День 2806. #ЗаметкиНаПолях Типы Коллекций в .NET, Которые Стоит Попробовать. Начало Больши…
  5. Oct 5, 2026День 2805. #ЧтоНовенького #NET11 Аргументы в Выражениях Коллекций в C#15 В C#15 реализован…
  6. Oct 4, 2026День 2804. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →