Lesson 5 of 40
Web Development
Intermediate
50 min
ASP.NET Core 10 Web APIs
Build production-grade REST APIs using ASP.NET Core 10's minimal APIs, native AOT compilation, and the new OpenAPI 3.1 support.
Part 1: Minimal APIs with Route Groups
var app = WebApplication.Create(args);
var orders = app.MapGroup("/api/orders")
.RequireAuthorization()
.WithOpenApi();
orders.MapGet("/{id}", async (int id, IOrderService svc) =>
await svc.GetByIdAsync(id) is {} order
? Results.Ok(order)
: Results.NotFound());
var orders = app.MapGroup("/api/orders")
.RequireAuthorization()
.WithOpenApi();
orders.MapGet("/{id}", async (int id, IOrderService svc) =>
await svc.GetByIdAsync(id) is {} order
? Results.Ok(order)
: Results.NotFound());
Part 2: Native AOT Compilation
Publish your API as a native binary for minimal startup time and memory footprint:
<!-- In .csproj -->
<PropertyGroup>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
AOT apps start in ~5ms and use 50% less memory vs JIT.<PropertyGroup>
<PublishAot>true</PublishAot>
<InvariantGlobalization>true</InvariantGlobalization>
</PropertyGroup>
Part 3: OpenAPI 3.1 with Scalar UI
VS 2026 generates OpenAPI 3.1 docs automatically and ships with the beautiful Scalar UI instead of Swagger:
builder.Services.AddOpenApi();
app.MapOpenApi();
app.MapScalarApiReference();
// Available at /scalar/v1
app.MapOpenApi();
app.MapScalarApiReference();
// Available at /scalar/v1
Part 4: Problem Details Standard
All error responses should follow RFC 7807 Problem Details:
builder.Services.AddProblemDetails();
// Automatic for 4xx/5xx responses
// Custom for domain errors:
app.UseExceptionHandler(handler =>
handler.MapProblemDetails());
// Automatic for 4xx/5xx responses
// Custom for domain errors:
app.UseExceptionHandler(handler =>
handler.MapProblemDetails());