Moduli, gestori e middleware
Suggerimento
Questo contenuto è un estratto dell'eBook, Blazor per gli sviluppatori di Web Forms ASP.NET per Azure, disponibile in .NET Docs o come PDF scaricabile gratuitamente che può essere letto offline.
Un'app ASP.NET Core è basata su una serie di middleware. Il middleware è costituito da gestori disposti in una pipeline per gestire richieste e risposte. In un'app Web Forms i gestori HTTP e i moduli risolveranno problemi simili. In ASP.NET Core, moduli, gestori, Global.asax.cse il ciclo di vita dell'app vengono sostituiti con middleware. In questo capitolo si apprenderà a conoscere il middleware nel contesto di un'app Blazor.
Panoramica
La pipeline delle richieste ASP.NET Core è costituita da una sequenza di delegati di richiesta, chiamati uno dopo l'altro. Il diagramma seguente illustra il concetto. Il thread di esecuzione seguente le frecce nere.
Il diagramma precedente non dispone di un concetto di eventi del ciclo di vita. Questo concetto è fondamentale per la gestione delle richieste di Web Forms ASP.NET. Questo sistema rende più semplice ragionare su quale processo si sta verificando e consente l'inserimento del middleware in qualsiasi momento. Il middleware viene eseguito nell'ordine in cui viene aggiunto alla pipeline di richiesta. Vengono aggiunti anche nel codice anziché nei file di configurazione, in genere in Startup.cs.
Katana
I lettori che hanno familiarità con Katana si sentiranno a proprio agio in ASP.NET Core. Katana è infatti un framework da cui deriva ASP.NET Core. Ha introdotto modelli di middleware e pipeline simili per ASP.NET 4.x. Il middleware progettato per Katana può essere adattato per funzionare con la pipeline ASP.NET Core.
Middleware comune
ASP.NET 4.x include molti moduli. In modo simile, ASP.NET Core include anche molti componenti middleware disponibili. I moduli IIS possono essere usati in alcuni casi con ASP.NET Core. In altri casi, il middleware core di ASP.NET nativo potrebbe essere disponibile.
La tabella seguente elenca il middleware e i componenti sostitutivi in ASP.NET Core.
Modulo | ASP.NET modulo 4.x | Opzione di ASP.NET Core |
---|---|---|
Errori HTTP | CustomErrorModule |
Middleware delle tabelle codici di stato |
Documento predefinito | DefaultDocumentModule |
Middleware dei file predefiniti |
Esplorazione directory | DirectoryListingModule |
Middleware di esplorazione directory |
Compressione dinamica | DynamicCompressionModule |
Middleware di compressione delle risposte |
Traccia delle richieste non riuscite | FailedRequestsTracingModule |
Registrazione di ASP.NET Core |
Memorizzazione nella cache dei file | FileCacheModule |
Middleware di memorizzazione nella cache delle risposte |
Memorizzazione nella cache HTTP | HttpCacheModule |
Middleware di memorizzazione nella cache delle risposte |
Registrazione HTTP | HttpLoggingModule |
Registrazione di ASP.NET Core |
Reindirizzamento HTTP | HttpRedirectionModule |
Middleware di riscrittura URL |
Filtri ISAPI | IsapiFilterModule |
Middleware |
ISAPI | IsapiModule |
Middleware |
Filtro richieste | RequestFilteringModule |
URL Riscrittura middleware IRule |
Riscrittura dell’URL† | RewriteModule |
Middleware di riscrittura URL |
Compressione statica | StaticCompressionModule |
Middleware di compressione delle risposte |
Contenuto statico | StaticFileModule |
Middleware dei file statici |
Autorizzazione URL | UrlAuthorizationModule |
Identità di ASP.NET Core |
Questo elenco non è esaustivo, ma deve dare un'idea del mapping esistente tra i due framework. Per un elenco più dettagliato, vedere Moduli IIS con ASP.NET Core.
Middleware personalizzato
Il middleware predefinito potrebbe non gestire tutti gli scenari necessari per un'app. In questi casi, è opportuno creare il proprio middleware. Esistono diversi modi per definire il middleware, con il semplice essere un delegato semplice. Si consideri il middleware seguente, che accetta una richiesta delle impostazioni cultura da una stringa di query:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Use(async (context, next) =>
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline
await next();
});
app.Run(async (context) =>
await context.Response.WriteAsync(
$"Hello {CultureInfo.CurrentCulture.DisplayName}"));
}
}
Il middleware può anche essere definito come classe, implementando l'interfaccia IMiddleware
o seguendo la convenzione middleware. Per altre informazioni, vedere Scrivere middleware personalizzato ASP.NET Core.