Уявіть, що ви приходите в ресторан. Ви — це клієнтський додаток (наприклад, браузер або мобільний застосунок). Офіціант — це мережевий протокол (HTTP), який приймає ваше замовлення і несе його на кухню. Кухня — це сервер. Але що робить кухню ефективною?
Кухня не може складатися з одного кухаря, який робить все від нарізки до випікання, особливо коли клієнтів тисячі. Повинен бути процес: хтось миє овочі, хтось смажить, хтось сервірує. У світі веб-розробки "кухня" — це веб-фреймворк. І якщо ви хочете обслуговувати мільйони запитів на секунду, без надійної та оптимізованої кухні ваш ресторан збанкрутує (сервер "впаде").
Проблема: У ранні 2000-ні роки створення веб-сервісів було болем. Ви мусили писати низькорівневий код для роботи з сокетами, самостійно парсити HTTP-заголовки, управляти пам'яттю і думати про безпеку потоків (thread safety). Це було повільно і небезпечно.
Рішення: Microsoft створила ASP.NET (Active Server Pages .NET) — могутній фреймворк, який взяв на себе всю рутину: обробку HTTP, маршрутизацію (routing), безпеку та управління сесіями. Завдання розробника звелося до написання безпосередньо бізнес-логіки.
Що ви дізнаєтесь?
До кінця цього модуля ви будете розуміти:
Пререквізити
Що потрібно знати перед стартом:
Ось те, що ми отримаємо в результаті — розуміння того, як лише 4 рядки коду здатні обробляти десятки тисяч запитів за секунду.
Щоб зрозуміти Minimal API, ми маємо зрозуміти Максимальний біль, від якого розробники тікали протягом останніх 20 років.
Коли інтернет тільки ставав масовим, веб-сторінки були переважно статичними. Microsoft хотіла залучити розробників десктопних програм (Windows Forms) до веб-розробки. Тому вони створили Web Forms — абстракцію, де веб-сторінка виглядала як "вікно", а кнопки мали події OnClick, як у звичайних програмах на комп'ютері.
З появою смартфонів і складних клієнтських додатків, підхід Web Forms зламався. Індустрія потребувала чіткого контролю над HTML та HTTP. З'явився ASP.NET MVC (Model-View-Controller). Цей паттерн розділив додаток на три частини:
Це був прорив, але фреймворк був жорстко прив'язаний до IIS (Internet Information Services) — веб-сервера, який працював тільки на Windows.
Світ змінився. Домінуючою платформою для серверів став Linux. Контейнеризація (Docker) вимагала легких додатків. Microsoft прийняла радикальне рішення: переписати ASP.NET з нуля.
Народився ASP.NET Core. Він став:

Навіть в ASP.NET Core MVC створення простого API (веб-сервісу, який повертає JSON) вимагало багато "церемоній": створення папок Controllers, написання класів-контролерів, атрибутів [HttpGet]. Це відлякувало новачків, які бачили, що в Node.js (Express) чи Python (FastAPI) можна підняти сервер в 3 рядки коду.
Для конкуренції в епоху мікросервісів, де сервіс може відповідати лише за одну функцію (наприклад, "Генерація PDF"), Microsoft представила Minimal APIs.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/hello", () => "Hello World");
app.Run();
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Controllers
{
[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok("Hello World");
}
}
}
// Плюс необхідність налаштовувати Startup.cs...
Бачите різницю? Minimal API прибирає весь "шум" (бойлерплейт). Але під капотом це той самий потужний, високопродуктивний рушій ASP.NET Core. Ви не жертвуєте продуктивністю заради стислості.
Що насправді відбувається, коли ви запускаєте ASP.NET Core додаток? Як код мовою C# перетворюється на працюючий веб-вузол?
Уявіть додаток ASP.NET Core як матрьошку або цибулину.


Давайте зупинимося на серці цієї системи — Kestrel.
WebApplicationBuilder налаштовує його за замовчуванням автоматично.Проблема: Раніше .NET-розробники використовували IIS (Internet Information Services) від Microsoft. Це був велетенський монстр, тісно зав'язаний на ядро (kernel) Windows. Він був неймовірно надійним, але дуже важким. Якщо ви хотіли запустити свій код на дешевому Linux-сервері в AWS чи DigitalOcean, ви не могли цього зробити.
Рішення: Команда ASP.NET створила Kestrel. Це відкритий, кросплатформений, надзвичайно швидкий веб-сервер, написаний мовою C#.
Kestrel регулярно займає топові позиції в бенчмарках (наприклад, TechEmpower), обробляючи мільйони запитів за секунду на одному сервері. Як це досягається?
Span<T> та Memory<T> — сучасні структури C#, які дозволяють читати дані з пам'яті (мережевого буфера) без їхнього копіювання чи створення нових об'єктів.System.IO.Pipelines.Хоча Kestrel швидкий, історично йому не вистачало функцій для "жорстокого Інтернету" (наприклад, розширеного захисту від DDoS, складного балансування навантаження, кешування).
Тому в 99% випадків Kestrel не виставляють напряму в Інтернет на порт 80 (HTTP) або 443 (HTTPS). Його ховають за реверс-проксі (Reverse Proxy).
Ця архітектура дозволяє кожному інструменту робити те, що в нього виходить найкраще: Nginx бореться з поганим трафіком і управляє сертифікатами безпеки, а Kestrel займається виключно виконанням вашого C#-коду з максимальною швидкостю.
Ми вже згадали, що існує кілька парадигм (підходів) для розробки. Чому Minimal APIs зараз в тренді, і чи означає це, що MVC мертвий?
Давайте розглянемо порівняльну таблицю.
| Характеристика | MVC / Controllers API | Minimal API | Причина вибору |
|---|---|---|---|
| Точка входу та налаштування | Розподілено (раніше між Program.cs та Startup.cs, плюс тека Controllers/) | Централізовано (переважно все в Program.cs) | Для дрібних мікросервісів легше тримати все "перед очима". |
| Продуктивність (Routing overhead) | Висока (використовує рефлексію та пошук контролерів у runtime) | Найвища (прямий мапінг делегатів у пайплайні роутера) | У високонавантажених сценаріях Minimal API б'є рекорди, оскільки не витрачає час на створення екземплярів (instantiating) класів контролерів. |
| Організація коду | Автоматична структура через директорії (класи з методами) | Вимагає свідомої організації від розробника (інакше Program.cs стане 10_000 рядками бруду) | MVC змушує писати стандартизовано. В Minimal API ви повинні самі застосовувати патерни (наприклад, Carter або Extension methods для групування). |
| Сфера застосування | Гігантські ентерпрайз-моноліти (ERP системи, соцмережі). | Мікросервіси, serverless функції, IoT бекенди, швидкі пет-проєкти. | Використовуйте правильний інструмент. Minimal API — це скальпель. MVC — швейцарський ніж. |

З чого почати створення власного додатку? Microsoft надає набір попередньо налаштованих шаблонів (Templates), які генерують базову структуру папок і файлів залежно від ваших цілей.
Команда: dotnet new web
Program.cs із app.MapGet("/", () => "Hello World!");. Ідеально для мікросервісів або якщо ви хочете побудувати архітектуру з абсолютного нуля.Команда: dotnet new webapi
Команда: dotnet new mvc
Controllers/, Models/, Views/.Команда: dotnet new blazorserver / blazorwasm
Команда: dotnet new grpc
!TIPЗолоте правило: Ви можете змішувати обидва підходи в межах ОДНОГО додатку! ASP.NET Core не змушує вас обирати щось назавжди. Ви можете мати контролер
OrdersControllerдля складної логіки обміну замовленнями, і водночас мати легкий Minimal API маршрутapp.MapGet("/health", () => "OK")для перевірки стану сервера на балансувальнику навантаження. Це геніальна універсальність.
Як розробникам Microsoft вдалося зробити код Minimal API таким коротким? Чому нам більше не треба писати public static void Main(string[] args) та простори імен namespace MyApp?
Це стало можливим завдяки фічам мови C#, які розвивалися паралельно з фреймворком.
Раніше, щоб надрукувати "Hello World", ви мали написати класичний шаблон:
using System;
namespace MyFirstApp
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
Але що насправді важливо в цьому коді? Тільки рядок Console.WriteLine. Усе інше — це "леса" або "церемонія", яка потрібна була компілятору, щоб зрозуміти, звідки починається програма.
Починаючи з C# 9.0, компілятор навчився "додумувати" все це самостійно. Тепер весь файл може складатися з одного рядка:
Console.WriteLine("Hello World!");
Компілятор сам оберне цей код у невидимий клас Program та метод Main. Саме тому Program.cs у Minimal API починається безпосередньо з var builder = WebApplication.CreateBuilder(args);.
Раніше на початку кожного файлу у великих проектах були "простирадла" з using System;, using Microsoft.AspNetCore.Mvc; тощо.
Зараз ви можете написати global using System; один раз в окремому файлі, і компілятор додасть цей імпорт до всіх файлів у проекті.
Більше того, для проектів типу Microsoft.NET.Sdk.Web (веб-додатки), SDK автоматично вмикає Implicit Usings. Це означає, що вам не потрібно руками додавати базові using (наприклад Microsoft.AspNetCore.Builder чи Microsoft.Extensions.DependencyInjection). Вони вже включені невидимо! Це робить код кришталево чистим.
У цьому модулі ми розібрали фундаментальні поняття:
Зараз ми бачимо повну картину того, для чого створений цей інструмент. Ми знаємо принципи його роботи. Наступний крок — навчитися створювати такі додатки власноруч.
У наступному модулі ми крок за кроком пройдемо створення вашого першого проекту, розібравши анатомію згенерованого коду. Ми порівняємо, як це робиться через консоль (.NET CLI) та в поширених IDE (Visual Studio, JetBrains Rider).