ASP.NET Core — Cheat Sheet

Tag: aspnetcore, dotnet, csharp, webapi, backend, middleware

Livello: intermedio

TL;DR: Framework open-source ad alte prestazioni per web application e API REST su .NET, basato su pipeline a middleware e dependency injection nativa.

Concetti chiave

Kestrel e' il web server cross-platform predefinito, ottimizzato per I/O asincrono non bloccante.

La pipeline HTTP elabora le richieste bidirezionalmente attraverso una catena ordinata di middleware.

La Dependency Injection e' nativa e gestisce i cicli di vita Transient, Scoped e Singleton.

Minimal API permette di creare endpoint HTTP leggeri senza il boilerplate dell'architettura MVC.

Endpoint Routing separa la fase di selezione dell'azione dalla sua esecuzione effettiva.

Configuration unifica gerarchicamente file JSON, variabili d'ambiente, secret e parametri da riga di comando.

ILogger fornisce un'astrazione unificata per il logging strutturato verso multipli sink.

I filtri MVC consentono di eseguire codice prima o dopo specifiche fasi del ciclo di vita dei controller.

Asynchronous programming tramite async e await evita il blocco dei thread del pool durante chiamate I/O.

Model Binding mappa automaticamente dati da query string, route, header e body verso oggetti tipizzati.

Domande tipiche e risposte pronte

Q: Qual e' la differenza tra i cicli di vita Transient, Scoped e Singleton?R: Transient crea una nuova istanza a ogni richiesta. Scoped riusa la stessa istanza all'interno della stessa richiesta HTTP. Singleton mantiene un'unica istanza condivisa per l'intera durata dell'applicazione.

Q: Come funziona la pipeline dei middleware e l'ordine di invocazione?R: Ogni middleware riceve l'HttpContext e richiama il successivo tramite il delegato next. L'ordine di registrazione in Program.cs e' cruciale perche' determina l'ordine esatto sia in entrata che in uscita.

Q: Perche' non si deve risolvere un servizio Scoped all'interno di un Singleton?R: Provoca il captive dependency bug: il servizio Scoped diventa di fatto un Singleton senza rilasciare le risorse alla fine della richiesta HTTP.

Q: Quando scegliere Minimal API rispetto ai Controller MVC?R: Uso Minimal API per microservizi focalizzati e ad alte prestazioni; preferisco i controller quando l'applicazione richiede gestione avanzata di filtri, model binding complesso o rendering di viste.

Q: Come si gestiscono gli errori globali in ASP.NET Core?R: Configuro il middleware UseExceptionHandler per intercettare le eccezioni non gestite e restituire risposte standardizzate in formato ProblemDetails.

Insidie e errori comuni

Risolvere servizi Scoped da un Singleton cattura l'istanza e puo' causare memory leak o concorrenza su DbContext.

Sbagliare l'ordine dei middleware, per esempio posizionando UseAuthorization prima di UseAuthentication.

Usare chiamate sincrone bloccanti come Task.Result o Task.Wait che causano thread pool starvation.

Scrivere su HttpContext.Response dopo aver gia' iniziato a inviare gli header al client.

Inserire logica di business pesante all'interno dei costruttori dei servizi registrati in DI.

Snippet e comandiC#

```var builder = WebApplication.CreateBuilder(args);

builder.Services.AddScoped<IOrderService, OrderService>();

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())

{

app.UseSwagger();

app.UseSwaggerUI();

}

app.UseHttpsRedirection();

app.UseAuthentication();

app.UseAuthorization();

app.MapGet("/api/orders/{id:int}", async (int id, IOrderService service) =>

{

var order = await service.GetByIdAsync(id);

return order is not null ? Results.Ok(order) : Results.NotFound();

});

app.Run();

dotnet new webapi -n MyApp

dotnet add package Microsoft.EntityFrameworkCore

dotnet run

```

Da ripassare

[ ] Regole di propagazione del CancellationToken attraverso i metodi asincroni

[ ] Scrittura di middleware personalizzati tramite convenzione IMiddleware

[ ] Configurazione di autenticazione JWT Bearer e policy-based authorization

[ ] Gestione del pool di HttpClient tramite IHttpClientFactory

[x] Configurazione base del WebApplicationBuilder e minimal API

[x] Registrazione e risoluzione dei cicli di vita in IServiceCollection

Riferimenti

Documentazione ufficiale Microsoft Learn: ASP.NET Core Fundamentals

Specifiche RFC 7807: Problem Details for HTTP APIs

Jarvis Interviews
Jarvis