1. Старт: .NET 10, структура проекта, middleware и конфигурация
Старт: .NET 10, структура проекта, middleware и конфигурация
В этой статье мы соберём прочный фундамент для всего курса: создадим проект на ASP.NET Core под .NET 10, разберём структуру решения, поймём что реально происходит в Program.cs, как устроен конвейер обработки HTTP-запросов (middleware pipeline) и как работает конфигурация приложения.
В следующих статьях мы будем строить MVC и Razor Pages, подключать аутентификацию и авторизацию, добавлять современные UI-паттерны. Но всё это работает только если вы уверенно понимаете базовые механизмы.
Что понадобится
net10.0)Полезные справочные ссылки:
Создаём проект MVC или Razor Pages
В ASP.NET Core есть два близких подхода к созданию серверного UI:
Для курса подойдут оба подхода: фундамент одинаковый (хост, middleware, DI, конфигурация, аутентификация). Вы можете выбрать один, а потом при желании сравнить со вторым.
Создание проекта MVC
Создание проекта Razor Pages
После запуска откройте адрес из консоли (обычно http://localhost:xxxx).
Структура проекта: что где лежит и зачем
Структура зависит от шаблона (MVC или Razor Pages), но ключевые элементы похожи.
| Элемент | Где встречается | Зачем нужен |
|---|---|---|
| Program.cs | всегда | Точка входа: создаёт приложение, настраивает сервисы и middleware |
| appsettings.json | всегда | Базовая конфигурация (логирование, ваши настройки) |
| appsettings.Development.json | обычно | Настройки только для Development |
| Properties/launchSettings.json | часто | Профили запуска, переменные окружения при старте из IDE |
| wwwroot/ | часто | Статика: CSS, JS, изображения |
| Controllers/ | MVC | Контроллеры |
| Views/ | MVC | Razor-представления |
| Models/ | MVC (часто) | Модели для UI/валидации/данных |
| Pages/ | Razor Pages | Razor-страницы (.cshtml + PageModel) |
Важная мысль: папки сами по себе “магии” не дают. Магия включается, когда вы добавляете соответствующие сервисы (например, MVC) и включаете маршрутизацию/endpoint’ы.
Program.cs: минимальная модель хостинга
Современный ASP.NET Core использует минимальную модель хостинга: всё обычно помещается в Program.cs.
Ниже пример типового Program.cs (упрощённо). Он почти одинаков для MVC и Razor Pages, отличаются только строки подключения UI-фреймворка.
Пример: MVC
Пример: Razor Pages
Ключевая идея:
builder.Services... добавляет возможности приложения (MVC, Razor Pages, аутентификация, базы данных и т.д.).app.Use... задаёт как именно запрос проходит через конвейер.app.Map... описывает какие endpoint’ы доступны (маршруты, страницы).Middleware: конвейер обработки запроса
Middleware — это компоненты, которые обрабатывают каждый HTTP-запрос по цепочке. Каждый middleware может:
!Диаграмма конвейера middleware и критичность порядка
Официальная документация: Middleware в ASP.NET Core
Почему порядок Use... критичен
Потому что один middleware часто подготавливает данные для другого.
Типичный порядок для приложений с UI и безопасностью:
UseExceptionHandler или UseDeveloperExceptionPage (в зависимости от окружения)UseHsts (обычно только не в Development)UseHttpsRedirectionUseStaticFilesUseRoutingUseAuthenticationUseAuthorizationMap... (эндпоинты MVC/Razor Pages)Пример логики:
UseStaticFiles после Map..., статические файлы могут не отдаваться так, как ожидается.UseAuthorization до UseAuthentication, то авторизация не сможет опереться на установленного пользователя.Endpoint routing: UseRouting и Map...
app.UseRouting() включает механизм сопоставления запроса с endpoint’ом.app.MapControllerRoute(...) или app.MapRazorPages() объявляет, какие endpoint’ы существуют.Важно: Map... обычно размещают ближе к концу, когда уже подключены нужные middleware (например, аутентификация).
Окружения: Development, Staging, Production
ASP.NET Core использует окружения, чтобы включать разные настройки и поведение.
В коде это видно через app.Environment.IsDevelopment().
Справка: Окружения в ASP.NET Core
Конфигурация: откуда берутся настройки
ASP.NET Core собирает конфигурацию из нескольких источников (providers). На практике чаще всего используются:
appsettings.jsonappsettings.{Environment}.json (например, appsettings.Development.json)Справка: Конфигурация в ASP.NET Core
Пример: добавим свою настройку в appsettings.json
appsettings.json:
Чтение напрямую из конфигурации (быстро, но не всегда идеально для больших проектов):
Замечания:
builder.Configuration["App:BrandName"] возвращает строку или null.Options pattern: типобезопасные настройки
Создадим класс настроек:
Зарегистрируем в DI и свяжем с секцией App:
Что это даёт:
Dependency Injection: как подключаются сервисы
ASP.NET Core из коробки использует DI-контейнер. Вы регистрируете зависимости в builder.Services, а затем получаете их:
MapGet, MapPost)Справка: Dependency injection в ASP.NET Core
Время жизни сервисов
Чаще всего используются:
Singleton: один экземпляр на всё приложениеScoped: один экземпляр на запросTransient: новый экземпляр каждый разВажно заранее понимать: контекст запроса (например, многие вещи вокруг аутентификации и работы с данными) обычно требует Scoped.
Статика, ошибки, HTTPS: базовые middleware “по умолчанию”
UseHttpsRedirection перенаправляет HTTP на HTTPS.UseStaticFiles включает раздачу файлов из wwwroot.UseExceptionHandler задаёт безопасную обработку ошибок в Production.UseHsts добавляет HSTS-заголовок (в Production).Документация:
Итог
Вы разобрали основу, на которой строится всё остальное:
Program.cs в минимальной модели хостингаappsettings.json, окружения, providers)В следующей статье логично перейти к созданию страниц/контроллеров, маршрутизации, layout’ам и подготовить приложение к подключению аутентификации и авторизации.