Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anteckning
Det här är inte den senaste versionen av den här artikeln. Den aktuella versionen finns i .NET 10-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i .NET 10-versionen av den här artikeln.
Mellanprogram är programvara som monteras i en apppipeline för att hantera begäranden och svar. Varje mellanprogram:
- Väljer om begäran ska skickas till nästa mellanprogram i pipelinen.
- Kan utföra arbete före och efter nästa mellanprogram i pipelinen.
Begärandedelegater används för att bygga begärandepipelinen. Begärandedelegaterna hanterar varje HTTP-begäran.
Konfigurera begärandelegater med hjälp av tilläggsmetoderna Run, Map och Use. Du kan ange ett enskilt begärandedelagat inline som en anonym metod (så kallat inline-mellanprogram) eller definiera det i en återanvändbar klass. Dessa interna anonyma metoder eller återanvändbara klasser kallas mellanprogram eller mellanprogramskomponenter. Varje mellanprogram i begärandepipelinen ansvarar för att anropa nästa mellanprogram i pipelinen eller kortsluta pipelinen. När ett mellanprogram kortsluts kallas det för ett terminalmellanprogram eftersom det förhindrar att ytterligare mellanprogram bearbetar begäran.
Mer information om skillnaden mellan begärandepipelines i ASP.NET Core och ASP.NET 4.x, med fler exempel på mellanprogram, finns i Migrera HTTP-moduler till ASP.NET Core-mellanprogram.
Roll för mellanprogram efter apptyp
Serversidan Blazor, Razor Pages och MVC bearbetar webbläsarbegäranden på servern med mellanprogram. Vägledningen i den här artikeln gäller för dessa typer av appar.
Fristående Blazor WebAssembly appar körs helt på klienten och bearbetar inte begäranden med en pipeline för mellanprogram. Vägledningen i den här artikeln gäller inte för fristående Blazor WebAssembly appar.
Kodanalys för mellanprogram
Mer information om ASP.NET Core kompilatorplattformsanalyserare som inspekterar appkod för kvalitet finns i Diagnostik Code Analysis i ASP.NET Core Apps.
Skapa en pipeline för mellanprogram med WebApplication
Pipelinen för ASP.NET Core-begäran består av en sekvens med förfrågedelegater som anropas efter varandra. Följande diagram visar konceptet. Exekveringstråden följer de svarta pilarna.
Varje ombud kan utföra åtgärder före och efter nästa ombud. Ombud för undantagshantering bör anropas tidigt i pipelinen, så att de kan fånga upp undantag som inträffar i senare skeden av pipelinen.
Anteckning
Om du vill experimentera lokalt med kodexemplen i det här avsnittet skapar du en ASP.NET Core-app med hjälp av projektmallen ASP.NET Core Empty . Om du använder .NET CLI är web mallens korta namn (dotnet new web).
Det enklaste sättet att anropa en ASP.NET Core-app Run är att ställa in en enda terminal mellanvara som en anonym funktionsbegäran, vilket möjliggör hantering av begäran utan någon förfrågningspipeline.
I följande exempel:
- Anropet till RunExtensions.Run anropas på varje begäran och skriver "Hello world!" till svaret.
- Anropet till WebApplication.Run i slutet av kodblocket kör appen och blockerar den anropande tråden tills värden stängs av.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Run();
Svar vid åtkomst till appen i en webbläsare vid dess start-URL:
Hello world!
Länka flera ombud för förfrågningar tillsammans med Use. Parametern next representerar nästa ombud i pipelinen. Du kan utföra åtgärder vanligtvis både före och efter delegeringen next.
Följande exempel visar:
- Två Use anrop, var och en skriver till konsolen:
- Där arbete kan utföras som kan skriva till svaret (
context.Response, HttpResponse). - Där arbete kan utföras utan att skriva till svaret efter att parametern
nexthar anropats.
- Där arbete kan utföras som kan skriva till svaret (
- Ett ombud för terminalbegäran med ett anrop till RunExtensions.Run som skriver "Hello world!" till svaret.
- Ett sista Use anrop som aldrig körs eftersom det följer terminalbegärandelegeringen Run .
- Ett anrop till WebApplication.Run i slutet av kodblocket för att köra appen och blockera den anropande tråden tills värden stängs av.
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Use(async (context, next) =>
{
Console.WriteLine("Work that can write to the response. (1)");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response. (1)");
});
app.Use(async (context, next) =>
{
Console.WriteLine("Work that can write to the response. (2)");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response. (2)");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello world!");
});
app.Use(async (context, next) =>
{
Console.WriteLine("This statement isn't reached. (3)");
await next.Invoke(context);
Console.WriteLine("This statement isn't reached. (3)");
});
app.Run();
I appens konsolfönster när appen körs:
Arbete som kan skriva till svaret. (1)
Arbete som kan skriva till svaret. (2)
Arbete som inte skriver till svaret. (2)
Arbete som inte skriver till svaret. (1)
Det är ofta önskvärt att kortsluta pipelinen för begäran eftersom den undviker onödigt arbete. Till exempel kan statiska filmellanprogram fungera som ett terminalmellanprogram genom att bearbeta en begäran om en statisk fil och kortsluta resten av pipelinen. Mellanprogramvara som läggs till i pipelinen före terminalmellanprogramvaran bearbetar fortfarande kod efter sina next.Invoke instruktioner. Om du inte planerar att anropa next.Invoke eftersom ditt mål är att avsluta pipelinen, använd en Run delegat istället för att anropa Use-tilläggsmetoden.
Anropa next.Invoke inte under eller efter att svaret har skickats till klienten. När en HttpResponse har startats resulterar ändringar i ett undantag. Om du till exempel anger rubriker eller en svarsstatuskod utlöser du ett undantag när svaret har startats. Att skriva till svarstexten efter anropet next kan:
- Orsaka en protokollöverträdelse, till exempel att skriva fler byte till svaret än det angivna svarets innehållslängd (
Content-Lengthrubrikvärde). - Skada brödtextformatet, till exempel att skriva en HTML-sidfot till en CSS-fil.
För att avgöra om svaret har startat kontrollerar du värdet för HasStarted.
Mer information finns i Kortslutning mellanprogram efter routning.
Run Delegera
En Run delegerad tar inte emot en next parameter. Det första Run delegerade avslutar alltid pipelinen.
Run är också en konvention, och vissa mellanprogram kan exponera Run metoder som körs i slutet av pipelinen.
Inga Use eller Run delegater anropas efter att den första Run delegaten anropats.
Förgrena pipelinen för mellanprogram
Map tillägg används som en konvention för att förgrena pipelinen för bearbetning av begäranden. Map förgrenar pipelinen för begäran baserat på matchningar av den angivna sökvägen för begäran. Om begärandesökvägen börjar med den angivna sökvägen körs grenen.
I följande exempel HandleMap1 anropas för begäranden till /map1och HandleMap2 anropas för begäranden till /map2:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1", HandleMap1);
app.Map("/map2", HandleMap2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate!");
});
app.Run();
private static void HandleMap1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 1");
});
}
private static void HandleMap2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map 2");
});
}
I följande tabell visas begäranden och svar med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
/ |
Hello from the non-Map delegate. |
/map1 |
Map 1 |
/map2 |
Map 2 |
/map3 |
Hello from the non-Map delegate. |
När Map används tas de matchade sökvägssegmenten bort från HttpRequest.Path och läggs till i HttpRequest.PathBase för varje begäran.
Map kan matcha flera segment samtidigt:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/map1/segment1", HandleMultipleSegments);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
private static void HandleMultipleSegments(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Processing '/map1/segment1'");
});
}
I följande tabell visas begäranden och svar med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
/ |
Hello from the non-Map delegate. |
/map1/segment1 |
Processing '/map1/segment1' |
Map stöder kapsling:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
level2AApp.Run(async context =>
{
await context.Response.WriteAsync("Processing '/level1/level2a'");
});
});
level1App.Map("/level2b", level2BApp => {
level2BApp.Run(async context =>
{
await context.Response.WriteAsync("Processing '/level1/level2b'");
});
});
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate!");
});
app.Run();
I följande tabell visas begäranden och svar med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
/ |
Hello from the non-Map delegate. |
/level1/level2a |
Processing '/level1/level2a' |
/level1/level2b |
Processing '/level1/level2b' |
MapWhen förgrenar pipelinen för begäran baserat på resultatet av det angivna predikatet. Alla predikat av typen Func<HttpContext, bool> kan användas för att mappa begäranden till en ny gren av pipelinen. I följande exempel används ett predikat för att identifiera förekomsten av en frågesträngsvariabel med namnet "branch":
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapWhen(context => context.Request.Query.ContainsKey("branch"), HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = '{branchVer}'");
});
}
I följande tabell visas begäranden och svar med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
/ |
Hello from the non-Map delegate. |
/?branch=main |
Branch used = 'main' |
UseWhen kan förgrena pipelinen för begäran baserat på resultatet av det angivna predikatet. Till skillnad från MapWhenåteransluts grenen till huvudpipelinen om den inte innehåller något terminalmellanprogram:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from the non-Map delegate.");
});
app.Run();
void HandleBranchAndRejoin(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetRequiredService<ILogger<Program>>();
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer.ToString());
Console.WriteLine("Work that can write to the response.");
await next.Invoke(context);
Console.WriteLine("Work that doesn't write to the response.");
});
}
I föregående exempel skrivs ett svar av "Hello from the non-Map delegate." för alla begäranden. Om begäran innehåller en frågesträngsvariabel med namnet "branch" loggas dess värde innan huvudpipelinen återansluts.
Skapa en pipeline för mellanprogram med IApplicationBuilder
Pipelinen för ASP.NET Core-begäran består av en sekvens med förfrågedelegater som anropas efter varandra. Följande diagram visar konceptet. Exekveringstråden följer de svarta pilarna.
Varje ombud kan utföra åtgärder före och efter nästa ombud. Ombud för undantagshantering bör anropas tidigt i pipelinen, så att de kan fånga upp undantag som inträffar i senare skeden av pipelinen.
Den enklaste möjliga ASP.NET Core-appen konfigurerar ett ombud för en enda begäran som hanterar alla begäranden. Det här fallet innehåller inte en verklig begärandepipeline. I stället anropas en enda anonym funktion som svar på varje HTTP-begäran.
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
}
}
Länka flera ombud för förfrågningar tillsammans med Use. Parametern next representerar nästa ombud i pipelinen. Du kan kortsluta pipelinen genom att inte anropa parametern nästa. Du kan vanligtvis utföra åtgärder både före och efter nästa ombud, vilket visas i följande exempel:
app.Use(async (context, next) =>
{
// Do work that doesn't write to the Response.
await next.Invoke();
// Do logging or other work that doesn't write to the Response.
});
När en delegerad inte vidarebefordrar en begäran till nästa delegerad kallas det att avbryta begärandepipelinen. Kortslutning är ofta önskvärt eftersom det undviker onödigt arbete. Till exempel kan statiska filmellanprogram fungera som ett terminalmellanprogram genom att bearbeta en begäran om en statisk fil och kortsluta resten av pipelinen. Mellanprogram som lagts till i pipelinen innan mellanprogrammet som avslutar ytterligare bearbetning bearbetar fortfarande kod efter deras next.Invoke-instruktioner. Se dock följande varning om att försöka skriva till ett svar som redan har skickats.
Varning
Anropa inte next.Invoke när svaret har skickats till klienten. Ändringar i HttpResponse när svaret har börjat generera ett undantag. Till exempel kan att sätta rubriker och en statuskod utlösa ett undantag. Att skriva till svarstexten efter att ha anropat next:
- Kan orsaka en protokollöverträdelse. Du kan till exempel skriva mer än den angivna
Content-Length. - Kan förstöra kroppsformatet. Du kan till exempel skriva en HTML-sidfot till en CSS-fil.
HasStarted är ett användbart tips för att ange om rubriker har skickats eller om brödtexten har skrivits till.
Run ombud får ingen next parameter. Den första Run delegerade är alltid terminal och avslutar pipelinen.
Run är en konvention. Vissa mellanprogramskomponenter kan exponera Run[Middleware] metoder som körs i slutet av pipelinen:
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from 2nd delegate.");
});
I föregående exempel skriver Run-ombudet "Hello from 2nd delegate." till svaret och avslutar sedan pipelinen. Om en annan Use- eller Run-ombud läggs till efter Run-ombudet, så anropas det inte.
Förgrena pipelinen för mellanprogram
Map tillägg används som en konvention för att förgrena pipelinen.
Map förgrenar pipelinen för begäran baserat på matchningar av den angivna sökvägen för begäran. Om begärandesökvägen börjar med den angivna sökvägen körs grenen.
public class Startup
{
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
private static void HandleMapTest2(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 2");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1", HandleMapTest1);
app.Map("/map2", HandleMapTest2);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
I följande tabell visas begäranden och svar från http://localhost:1234 med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
| localhost:1234 | Hej från en icke-Map-delegat. |
| localhost:1234/map1 | Karttest 1 |
| localhost:1234/map2 | Karttest 2 |
| localhost:1234/map3 | Hej från en icke-Map-delegat. |
När Map används tas de matchade sökvägssegmenten bort från HttpRequest.Path och läggs till i HttpRequest.PathBase för varje begäran.
Map stöder kapsling, till exempel:
app.Map("/level1", level1App => {
level1App.Map("/level2a", level2AApp => {
// "/level1/level2a" processing
});
level1App.Map("/level2b", level2BApp => {
// "/level1/level2b" processing
});
});
Map kan också matcha flera segment samtidigt:
public class Startup
{
private static void HandleMultiSeg(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map multiple segments.");
});
}
public void Configure(IApplicationBuilder app)
{
app.Map("/map1/seg1", HandleMultiSeg);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
MapWhen förgrenar pipelinen för begäran baserat på resultatet av det angivna predikatet. Du kan använda valfritt predikat av typen Func<HttpContext, bool> för att mappa begäranden till en ny gren av pipelinen. I följande exempel identifierar ett predikat förekomsten av en frågesträngsvariabel branch:
public class Startup
{
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
public void Configure(IApplicationBuilder app)
{
app.MapWhen(context => context.Request.Query.ContainsKey("branch"),
HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate.");
});
}
}
I följande tabell visas begäranden och svar från http://localhost:1234 med hjälp av föregående kod.
| Begäran | Svar |
|---|---|
| localhost:1234 | Hej från en icke-Map-delegat. |
| localhost:1234/?branch=main | Gren som används = main |
UseWhen förgrenar även pipelinen för begäran baserat på resultatet av det angivna predikatet. Till skillnad från med MapWhenåteransluts den här grenen till huvudpipelinen om den inte kortsluter eller innehåller ett terminalmellanprogram:
public class Startup
{
private void HandleBranchAndRejoin(IApplicationBuilder app, ILogger<Startup> logger)
{
app.Use(async (context, next) =>
{
var branchVer = context.Request.Query["branch"];
logger.LogInformation("Branch used = {branchVer}", branchVer.ToString());
// Do work that doesn't write to the Response.
await next();
// Do other work that doesn't write to the Response.
});
}
public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
{
app.UseWhen(context => context.Request.Query.ContainsKey("branch"),
appBuilder => HandleBranchAndRejoin(appBuilder, logger));
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from main pipeline.");
});
}
}
I det föregående exemplet skrivs svaret "Hej från huvudröret" för alla begäranden. Om begäran innehåller en frågesträngsvariabel branchloggas dess värde innan huvudpipelinen återansluts.
Mellanprogram läggs till automatiskt av WebApplication
WebApplicationlägger automatiskt till följande mellanprogram i ASP.NET Core appar beroende på vissa villkor:
-
UseDeveloperExceptionPageläggs till först närHostingEnvironmentär"Development". -
UseRoutingläggs till som nummer två om användarkoden inte redan har anropatUseRoutingoch om det finns konfigurerade slutpunkter, till exempelapp.MapGet. -
UseEndpointsläggs till i slutet av pipelinen för mellanprogram om några slutpunkter har konfigurerats. -
UseAuthenticationläggs till omedelbart efterUseRoutingom användarkoden inte redan anropadeUseAuthenticationoch omIAuthenticationSchemeProviderkan identifieras i tjänstleverantören.IAuthenticationSchemeProviderläggs till som standard när du använderAddAuthenticationoch tjänster identifieras med hjälp avIServiceProviderIsService. -
UseAuthorizationläggs till härnäst om användarkoden inte redan har anropatUseAuthorizationoch omIAuthorizationHandlerProviderkan upptäckas hos tjänsteleverantören.IAuthorizationHandlerProviderläggs till som standard när du använderAddAuthorizationoch tjänster identifieras med hjälp avIServiceProviderIsService. - Användar konfigurerade mellanprogram och slutpunkter läggs till mellan
UseRoutingochUseEndpoints.
Följande kod är i praktiken vad det automatiska mellanprogrammet som läggs till i appen genererar:
if (isDevelopment)
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
if (isAuthenticationConfigured)
{
app.UseAuthentication();
}
if (isAuthorizationConfigured)
{
app.UseAuthorization();
}
// user middleware/endpoints
app.CustomMiddleware(...);
app.MapGet("/", () => "hello world");
// end user middleware/endpoints
app.UseEndpoints(e => {});
I vissa fall är standardkonfigurationen för mellanprogram inte korrekt för appen och kräver ändringar. Till exempel UseCors bör anropas före UseAuthentication och UseAuthorization. Appen måste anropa UseAuthentication och UseAuthorization om UseCors anropas:
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
Om mellanprogram ska köras innan routningsmatchning sker UseRouting ska anropas och mellanprogrammet ska placeras före anropet till UseRouting.
UseEndpoints krävs inte i det här fallet eftersom det läggs till automatiskt enligt beskrivningen ovan:
app.Use((context, next) =>
{
return next(context);
});
app.UseRouting();
// other middleware and endpoints
När du lägger till ett terminalmellanprogram:
- Mellanprogrammet måste läggas till efter
UseEndpoints. - Appen måste anropa
UseRoutingochUseEndpointsså att terminalmellanprogrammet kan placeras på rätt plats.
app.UseRouting();
app.MapGet("/", () => "hello world");
app.UseEndpoints(e => {});
app.Run(context =>
{
context.Response.StatusCode = 404;
return Task.CompletedTask;
});
Terminalmellanprogram är mellanprogram som körs om ingen slutpunkt hanterar begäran.
WebApplication lägger automatiskt till följande mellanprogram i ASP.NET Core appar beroende på vissa villkor:
UseDeveloperExceptionPage läggs till först när HostingEnvironment är
"Development".UseRouting läggs till på andra sidan, om användarkoden inte redan anropade
UseRoutingoch slutpunkterna har konfigurerats, till exempelapp.MapGet.UseEndpoints läggs till i slutet av pipelinen för mellanprogram om slutpunkter har konfigurerats.
UseAuthentication läggs till omedelbart efter
UseRouting, om användarkoden inte redan anropadeUseAuthenticationoch om IAuthenticationSchemeProvider kan identifieras i tjänstleverantören.IAuthenticationSchemeProviderläggs till som standard när du använder AddAuthentication och tjänster identifieras med hjälp av IServiceProviderIsService.UseAuthorization läggs till härnäst, om användarkoden inte redan anropade
UseAuthorizationoch om IAuthorizationHandlerProvider kan identifieras i tjänstleverantören.IAuthorizationHandlerProviderläggs till som standard när du använder AddAuthorization och tjänster identifieras med hjälpIServiceProviderIsServiceav .Användar konfigurerade mellanprogram och slutpunkter läggs till mellan
UseRoutingochUseEndpoints.
Följande kod är i praktiken vad det automatiska mellanprogrammet som läggs till i appen genererar:
if (isDevelopment)
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
if (isAuthenticationConfigured)
{
app.UseAuthentication();
}
if (isAuthorizationConfigured)
{
app.UseAuthorization();
}
// User middleware/endpoints
app.CustomMiddleware(...);
app.MapGet("/", () => "hello world");
// End user middleware/endpoints
app.UseEndpoints(e => {});
I vissa fall är standardkonfigurationen för mellanprogram inte korrekt för appen och kräver ändringar. Till exempel UseCors bör anropas före UseAuthentication och UseAuthorization. Appen måste anropa UseAuthentication och UseAuthorization om UseCors anropas:
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
Om mellanprogram ska köras innan routningsmatchning sker UseRouting ska anropas och mellanprogrammet ska placeras före anropet till UseRouting.
UseEndpoints krävs inte i det här fallet eftersom det läggs till automatiskt enligt beskrivningen tidigare:
app.Use((context, next) =>
{
return next(context);
});
app.UseRouting();
// Other middleware and endpoints
När du lägger till ett terminalmellanprogram:
Mellanprogrammet måste läggas till efter
UseEndpoints.Appen måste anropa
UseRoutingochUseEndpointsså att terminalmellanprogrammet kan placeras på rätt plats.
app.UseRouting();
app.MapGet("/", () => "hello world");
app.UseEndpoints(e => {});
app.Run(context =>
{
context.Response.StatusCode = 404;
return Task.CompletedTask;
});
Terminalmellanprogram är mellanprogram som körs om ingen slutpunkt hanterar begäran.
Information om antiforgery-mellanprogram i Minimala API:er finns i Prevent Cross-Site Request Forgery(XSRF/CSRF) attacker i ASP.NET Core.
Mellanprogramvarubeställning
Ordningen som mellanmjukvaror visas i appens Program-filen anger ordningen i vilken de anropas vid en begäran, med omvänd ordning för svaret.
Du har fullständig kontroll över ordningen på mellanprogram och möjligheten att lägga till anpassade mellanprogram för scenarier för bearbetning av begäranden, med tanke på att ordningen på mellanprogram kan vara avgörande för säkerhet, prestanda och funktioner.
I följande exempel visas mellanprogramsordning för vanliga appscenarier. Varje mellanprogramstilläggsmetod exponeras på WebApplicationBuilder genom Microsoft.AspNetCore.Builder-namnområdet.
- Undantags- och felhantering
- När appen körs i
Developmentmiljön:- Mellanprogrammet för felsidan för utvecklare (UseDeveloperExceptionPage) rapporterar körningsfel i appen.
- Databasfelsidans mellanprogram (UseDatabaseErrorPage) rapporterar databaskörningsfel.
- När appen körs i
Productionmiljön:- Undantagshanterarens mellanprogram (UseExceptionHandler) fångar undantag som genereras i följande mellanprogram.
- HTTP Strict Transport Security (HSTS)-protokollmellanprogram (UseHsts) lägger till huvudet
Strict-Transport-Security.
- När appen körs i
- HTTPS-omdirigeringsmellanprogram (UseHttpsRedirection) omdirigerar HTTP-begäranden till HTTPS.
- Middleware för statiska filer (om det behövs, UseStaticFiles) returnerar statiska filer och avbryter vidare bearbetning av begäran.
- Cookie policy-mellanprogram (UseCookiePolicy) anpassar appen till EU:s allmänna dataskyddsförordning (GDPR).
- Dirigera mellanprogram (UseRouting) till routningsbegäranden.
- Mellanprogram för autentisering (UseAuthentication) försöker autentisera användaren innan de får åtkomst till säkra resurser.
- Auktorisering mellanprogram (UseAuthorization) ger en användare åtkomst till säkra resurser.
- Förfalskningsskyddsmellanprogram (UseAntiforgery) lägger till förfalskningsskyddsmellanprogram i pipelineflödet UseAntiforgery måste placeras efter anrop till UseAuthentication och UseAuthorization.
- Sessionsmellanprogramvara (Razor gäller endast Pages och MVC, UseSession) etablerar och upprätthåller sessionstillstånd. Om appen använder sessionstillstånd anropar du sessionsmellanprogram efter cookie principmellanprogram och före Razor Pages/MVC-mellanprogram.
- Mellanprogram för slutpunktsroutning
- MapRazorComponents för att lägga till Razor komponentslutpunkter i begärandepipelinen.
- MapRazorPages för att lägga till Razor sidslutpunkter i pipelinen för begäran.
- MapControllerRoute för att lägga till kontrollantslutpunkter i pipelinen för begäran.
Typisk Blazor Web App pipeline för mellanprogram:
app.UseWebAssemblyDebugging(); // Development environment with client-side rendering
app.UseMigrationsEndPoint(); // Development environment with ASP.NET Core Identity
app.UseExceptionHandler("/Error", createScopeForErrors: true); // Non-Development environment
app.UseHsts(); // Non-Development environment with HTTPS protocol
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection(); // With HTTPS protocol
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>(); // With additional extension methods for render modes
app.MapAdditionalIdentityEndpoints(); // With ASP.NET Core Identity
app.Run();
Typisk Razor Pages/MVC middleware-pipeline:
app.UseMigrationsEndPoint(); // Development environment with ASP.NET Core Identity
app.UseExceptionHandler("/Error"); // Non-Development environment
app.UseHsts(); // Non-Development environment with HTTPS protocol
app.UseHttpsRedirection(); // With HTTPS protocol
// app.UseCookiePolicy();
app.UseRouting(); // If not called, runs at the beginning of the pipeline by default
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
// app.UseAuthentication(); // Called internally for ASP.NET Core Identity
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapStaticAssets();
app.MapControllerRoute(...); // For MVC controllers
app.MapRazorPages(); // For Razor Pages pages
app.MapControllers(); // With authentication in a Razor Pages app
app.Run();
I föregående kod:
- CORS-mellanprogram (UseCors), mellanprogram för autentisering (UseAuthentication) och mellanprogram för auktorisering (UseAuthorization) måste visas i den ordning som visas.
- CORS-mellanprogram (UseCors) måste komma före mellanprogrammet för svarscachelagring (UseResponseCaching) för att lägga till CORS-huvuden för varje begäran, inklusive cachelagrade svar. Mer information finns i Det är inte klart att UseCORS måste komma före UseResponseCaching (
dotnet/aspnetcore#23218. - Middleware för lokalisering av begäran (UseRequestLocalization) måste komma före all middleware som kan kontrollera begärans kultur, till exempel middleware för statiska filer (UseStaticFiles).
- Frekvensbegränsande mellanprogram (UseRateLimiter) måste anropas efter routning av mellanprogram (UseRouting) när hastighetsbegränsning av slutpunktsspecifika API:er används. Om
[EnableRateLimiting]attributet till exempel används måste hastighetsbegränsande mellanprogram anropas efter routning av mellanprogram. När du endast anropar globala gränsbegränsare kan hastighetsbegränsande mellanprogram anropas innan mellanprogram dirigeras.
I vissa scenarier har mellanprogram olika sortering. Cachelagring och komprimeringsordning beror till exempel på appens specifikation. I följande ordning kan CPU-användningen minskas genom cachelagring av det komprimerade svaret, men appen kan i slutändan cachelagra flera representationer av en resurs med olika komprimeringsalgoritmer, till exempel Gzip eller Brotli:
app.UseResponseCaching();
app.UseResponseCompression();
Statiska tillgångar hanteras vanligtvis tidigt i pipelinen så att appen kan kortsluta bearbetning av begäranden för att förbättra prestandan.
Autentisering kortsluter inte oautentiserade begäranden. Även om autentiseringsmiddleware autentiserar begäranden, sker auktorisering efter att ramverket väljer en Razor-komponent i en Blazor Web App, en sida i en Razor Pages-app eller en styrenhet och åtgärd i en MVC-app.
Följande diagram visar den fullständiga pipelinen för bearbetning av begäranden för ASP.NET Core MVC- och Razor Pages-appar. Du kan se hur befintliga mellanprogram sorteras i en typisk app och var anpassade mellanprogram läggs till. Du har fullständig kontroll över hur du ändrar ordning på befintliga mellanprogram eller matar in nya anpassade mellanprogram efter behov för dina scenarier.
Endpoint-middleware i föregående diagram kör filterpipelinen för motsvarande apptyp – MVC eller Razor Pages.
Föregående diagram visar mellanprogrammet Routning efter statiska filer. Den här ordningen är hur projektmallarna fungerar genom att uttryckligen anropa appen. UseRouting. Om du inte anropar app.UseRoutingkörs Routning mellanprogram i början av pipelinen som standard. För mer information, se Routing.
I den ordning du lägger till mellanprogramskomponenter i Program.cs filen definieras i vilken ordning mellanprogramkomponenterna anropas på begäranden och omvänd ordning för svaret. Ordningen är kritisk för säkerhet, prestanda och funktioner.
Följande markerade kod i Program.cs lägger till säkerhetsrelaterade mellanprogramskomponenter i den vanliga rekommenderade ordningen:
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMiddleware.Data;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection")
?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRateLimiter();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapDefaultControllerRoute();
app.Run();
I föregående kod:
- Kommenterade mellanprogram läggs inte till när du skapar en ny webbapp med enskilda användarkonton.
- Inte alla mellanprogram visas i den här exakta ordningen, men många gör det. Till exempel:
-
UseCors,UseAuthenticationochUseAuthorizationmåste visas i den ordning som visas. -
UseCorsmåste för närvarande visas innanUseResponseCaching. Det här kravet förklaras i GitHub-problem med dotnet/aspnetcore #23218. -
UseRequestLocalizationmåste visas före alla mellanprogram som kan kontrollera begärandekulturen, till exempelapp.UseStaticFiles(). -
UseRateLimiter måste anropas efter
UseRoutingnär hastighetsbegränsning av slutpunktsspecifika API:er används. Om attributet[EnableRateLimiting]till exempel används måsteUseRateLimiteranropas efterUseRouting. När du bara anropar globala begränsare kanUseRateLimiteranropas innanUseRouting.
-
I vissa scenarier har mellanprogram olika sortering. Cachelagring och komprimeringsordning är till exempel scenariospecifika, och det finns flera giltiga ordningar. Till exempel:
app.UseResponseCaching();
app.UseResponseCompression();
Med föregående kod kan du minska CPU-användningen genom att cachelagra det komprimerade svaret, men det kan sluta med att du cachelagrar flera representationer av en resurs med olika komprimeringsalgoritmer som Gzip eller Brotli.
Följande ordning kombinerar statiska filer för att tillåta cachelagring av komprimerade statiska filer:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Följande Program.cs kod lägger till mellanprogramskomponenter för vanliga appscenarier:
- Undantags- och felhantering
- När appen körs i
Developmentmiljön:- Mellanprogrammet för felsidan för utvecklare (UseDeveloperExceptionPage) rapporterar körningsfel i appen.
- Databasfelsidans mellanprogram (UseDatabaseErrorPage) rapporterar databaskörningsfel.
- När appen körs i
Productionmiljön:- Undantagshanterarens mellanprogram (UseExceptionHandler) fångar undantag som genereras i följande mellanprogram.
- HTTP Strict Transport Security (HSTS)-protokollmellanprogram (UseHsts) lägger till huvudet
Strict-Transport-Security.
- När appen körs i
- HTTPS-omdirigeringsmellanprogram (UseHttpsRedirection) omdirigerar HTTP-begäranden till HTTPS.
- Middleware för statiska filer (UseStaticFiles) levererar statiska filer och avbryter vidare bearbetning av begäran.
- Cookie policy-mellanprogramvara (UseCookiePolicy) anpassar appen till EU:s allmänna dataskyddsförordning (GDPR).
- Dirigera mellanprogram (UseRouting) till routningsbegäranden.
- Mellanprogram för autentisering (UseAuthentication) försöker autentisera användaren innan de får åtkomst till säkra resurser.
- Auktorisering mellanprogram (UseAuthorization) ger en användare åtkomst till säkra resurser.
- Sessionsmellanprogram (UseSession) upprättar och underhåller sessionstillstånd. Om appen använder sessionstillstånd, anropar du sessionsmellanprogrammet efter cookie-principmellanprogrammet och före MVC-mellanprogrammet.
- Mellanprogram för slutpunktsdirigering (UseEndpoints med MapRazorPages) för att lägga till slutpunkter för Razor Pages i begärandepipelinen.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
I föregående exempelkod exponeras varje middleware-metod på WebApplicationBuilder genom Microsoft.AspNetCore.Builder-namnrymden.
UseExceptionHandler är den första mellanprogramskomponenten som läggs till i pipelinen. Därför fångar undantagshanterarens mellanprogram alla undantag som inträffar i senare anrop.
Mellanprogram för statiska filer anropas tidigt i pipelinen så att det kan hantera begäranden och kortslutning utan att gå igenom de återstående komponenterna. Mellanprogrammet för statiska filer utför inga auktoriseringskontroller. Alla filer som hanteras av statiska filmellanprogram, inklusive de under wwwroot, är offentligt tillgängliga. En metod för att skydda statiska filer finns i Hantera statiska filer i ASP.NET Core-appar.
Om begäran inte hanteras av den statiska filmellanprogrammet skickas den vidare till mellanprogrammet för autentisering (UseAuthentication), som utför autentisering. Autentisering kortsluter inte oautentiserade begäranden. Även om autentisering mellanprogram autentiserar begäranden sker auktorisering (och avvisande) först efter att MVC har valt en specifik Razor sida eller MVC-kontrollant och åtgärd.
I följande exempel visas en mellanprogramsordning där begäranden om statiska filer hanteras av statiska filmellanprogram före mellanprogram för svarskomprimering. Statiska filer komprimeras inte med den här mellanprogramsordningen. Svar på sidor Razor kan komprimeras.
// Static files aren't compressed by static file middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Följande diagram visar den fullständiga pipelinen för bearbetning av begäranden för ASP.NET Core MVC- och Razor Pages-appar. Du kan se hur befintliga mellanprogram sorteras i en typisk app och var anpassade mellanprogram läggs till. Du har fullständig kontroll över hur du ändrar ordning på befintliga mellanprogram eller matar in nya anpassade mellanprogram efter behov för dina scenarier.
Endpoint-middleware i föregående diagram kör filterpipelinen för motsvarande apptyp – MVC eller Razor Pages.
Föregående diagram visar mellanprogrammet Routning efter statiska filer. Den här ordningen är hur projektmallarna fungerar genom att uttryckligen anropa appen. UseRouting. Om du inte anropar app.UseRoutingkörs Routning mellanprogram i början av pipelinen som standard. För mer information, se Routing.
I den ordning du lägger till mellanprogramskomponenter i Program.cs filen definieras i vilken ordning mellanprogramkomponenterna anropas på begäranden och omvänd ordning för svaret. Ordningen är kritisk för säkerhet, prestanda och funktioner.
Följande markerade kod i Program.cs lägger till säkerhetsrelaterade mellanprogramskomponenter i den vanliga rekommenderade ordningen:
using IndividualAccountsExample.Data;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseMigrationsEndPoint();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.MapRazorPages();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
I föregående kod:
- Kommenterade mellanprogram läggs inte till när du skapar en ny webbapp med enskilda användarkonton.
- Inte alla mellanprogram visas i den här exakta ordningen, men många gör det. Till exempel:
-
UseCors,UseAuthenticationochUseAuthorizationmåste visas i den ordning som visas. -
UseCorsmåste för närvarande visas innanUseResponseCaching. Det här kravet förklaras i GitHub-problem med dotnet/aspnetcore #23218. -
UseRequestLocalizationmåste visas före alla mellanprogram som kan kontrollera begärandekulturen (till exempelapp.UseMvcWithDefaultRoute()).
-
I vissa scenarier har mellanprogram olika sortering. Cachelagring och komprimeringsordning är till exempel scenariospecifika, och det finns flera giltiga ordningar. Till exempel:
app.UseResponseCaching();
app.UseResponseCompression();
Med föregående kod kan du minska CPU-användningen genom att cachelagra det komprimerade svaret, men det kan sluta med att du cachelagrar flera representationer av en resurs med olika komprimeringsalgoritmer som Gzip eller Brotli.
Följande ordning kombinerar statiska filer för att tillåta cachelagring av komprimerade statiska filer:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Följande Program.cs kod lägger till mellanprogramskomponenter för vanliga appscenarier:
- Undantags- och felhantering
- När appen körs i
Developmentmiljön:- Mellanprogrammet för felsidan för utvecklare (UseDeveloperExceptionPage) rapporterar körningsfel i appen.
- Databasfelsidans mellanprogram (UseDatabaseErrorPage) rapporterar databaskörningsfel.
- När appen körs i
Productionmiljön:- Undantagshanterarens mellanprogram (UseExceptionHandler) fångar undantag som genereras i följande mellanprogram.
- HTTP Strict Transport Security (HSTS)-protokollmellanprogram (UseHsts) lägger till huvudet
Strict-Transport-Security.
- När appen körs i
- HTTPS-omdirigeringsmellanprogram (UseHttpsRedirection) omdirigerar HTTP-begäranden till HTTPS.
- Middleware för statiska filer (UseStaticFiles) levererar statiska filer och avbryter vidare bearbetning av begäran.
- Cookie policy-mellanprogramvara (UseCookiePolicy) anpassar appen till EU:s allmänna dataskyddsförordning (GDPR).
- Dirigera mellanprogram (UseRouting) till routningsbegäranden.
- Mellanprogram för autentisering (UseAuthentication) försöker autentisera användaren innan de får åtkomst till säkra resurser.
- Auktorisering mellanprogram (UseAuthorization) ger en användare åtkomst till säkra resurser.
- Sessionsmellanprogram (UseSession) upprättar och underhåller sessionstillstånd. Om appen använder sessionstillstånd, anropar du sessionsmellanprogrammet efter cookie-principmellanprogrammet och före MVC-mellanprogrammet.
- Mellanprogram för slutpunktsdirigering (UseEndpoints med MapRazorPages) för att lägga till slutpunkter för Razor Pages i begärandepipelinen.
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.MapRazorPages();
I föregående exempelkod exponeras varje middleware-metod på WebApplicationBuilder genom Microsoft.AspNetCore.Builder-namnrymden.
UseExceptionHandler är den första mellanprogramskomponenten som läggs till i pipelinen. Därför fångar undantagshanterarens mellanprogram alla undantag som inträffar i senare anrop.
Mellanprogram för statiska filer anropas tidigt i pipelinen så att det kan hantera begäranden och kortslutning utan att gå igenom de återstående komponenterna. Mellanprogrammet för statiska filer utför inga auktoriseringskontroller. Alla filer som hanteras av statiska filmellanprogram, inklusive de under wwwroot, är offentligt tillgängliga. En metod för att skydda statiska filer finns i Hantera statiska filer i ASP.NET Core-appar.
Om begäran inte hanteras av den statiska filmellanprogrammet skickas den vidare till mellanprogrammet för autentisering (UseAuthentication), som utför autentisering. Autentisering kortsluter inte oautentiserade begäranden. Även om autentisering mellanprogram autentiserar begäranden sker auktorisering (och avvisande) först efter att MVC har valt en specifik Razor sida eller MVC-kontrollant och åtgärd.
I följande exempel visas en mellanprogramsordning där begäranden om statiska filer hanteras av statiska filmellanprogram före mellanprogram för svarskomprimering. Statiska filer komprimeras inte med den här mellanprogramsordningen. Svar på sidor Razor kan komprimeras.
// Static files aren't compressed by static file middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.MapRazorPages();
Följande diagram visar den fullständiga pipelinen för bearbetning av begäranden för ASP.NET Core MVC- och Razor Pages-appar. Du kan se hur befintliga mellanprogram sorteras i en typisk app och var anpassade mellanprogram läggs till. Du har fullständig kontroll över hur du ändrar ordning på befintliga mellanprogram eller matar in nya anpassade mellanprogram efter behov för dina scenarier.
Endpoint-middleware i föregående diagram kör filterpipelinen för motsvarande apptyp – MVC eller Razor Pages.
Ordningen som mellanprogramkomponenter läggs till i metoden Startup.Configure definierar i vilken ordning mellanprogramkomponenterna anropas på begäranden och omvänd ordning för svaret. Ordningen är kritisk för säkerhet, prestanda och funktioner.
Följande Startup.Configure-metod lägger till säkerhetsrelaterade mellanprogramskomponenter i den vanliga rekommenderade ordningen:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
// app.UseResponseCompression();
// app.UseResponseCaching();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
I föregående kod:
- Kommenterade mellanprogram läggs inte till när du skapar en ny webbapp med enskilda användarkonton.
- Inte alla mellanprogram visas i den här exakta ordningen, men många gör det. Till exempel:
-
UseCors,UseAuthenticationochUseAuthorizationmåste visas i den ordning som visas. -
UseCorsmåste för närvarande visas innanUseResponseCachingpå grund av detta fel . -
UseRequestLocalizationmåste visas före alla mellanprogram som kan kontrollera begärandekulturen (till exempelapp.UseMvcWithDefaultRoute()).
-
I vissa scenarier har mellanprogram olika sortering. Cachelagring och komprimeringsordning är till exempel scenariospecifika och det finns flera giltiga ordningar. Till exempel:
app.UseResponseCaching();
app.UseResponseCompression();
Med föregående kod kan CPU sparas genom att cachelagra det komprimerade svaret, men det kan sluta med att du cachelagrar flera representationer av en resurs med olika komprimeringsalgoritmer som Gzip eller Brotli.
Följande ordning kombinerar statiska filer för att tillåta cachelagring av komprimerade statiska filer:
app.UseResponseCaching();
app.UseResponseCompression();
app.UseStaticFiles();
Följande Startup.Configure-metod lägger till mellanprogramskomponenter för vanliga appscenarier:
- Undantags- och felhantering
- När appen körs i
Developmentmiljön:- Mellanprogrammet för felsidan för utvecklare (UseDeveloperExceptionPage) rapporterar körningsfel i appen.
- Databasfelsidans mellanprogram rapporterar databaskörningsfel.
- När appen körs i
Productionmiljön:- Undantagshanterarens mellanprogram (UseExceptionHandler) fångar undantag som genereras i följande mellanprogram.
- HTTP Strict Transport Security (HSTS)-protokollmellanprogram (UseHsts) lägger till huvudet
Strict-Transport-Security.
- När appen körs i
- HTTPS-omdirigeringsmellanprogram (UseHttpsRedirection) omdirigerar HTTP-begäranden till HTTPS.
- Middleware för statiska filer (UseStaticFiles) levererar statiska filer och avbryter vidare bearbetning av begäran.
- Cookie policy-mellanprogramvara (UseCookiePolicy) anpassar appen till EU:s allmänna dataskyddsförordning (GDPR).
- Dirigera mellanprogram (UseRouting) till routningsbegäranden.
- Mellanprogram för autentisering (UseAuthentication) försöker autentisera användaren innan de får åtkomst till säkra resurser.
- Auktorisering mellanprogram (UseAuthorization) ger en användare åtkomst till säkra resurser.
- Sessionsmellanprogram (UseSession) upprättar och underhåller sessionstillstånd. Om appen använder sessionstillstånd, anropar du sessionsmellanprogrammet efter cookie-principmellanprogrammet och före MVC-mellanprogrammet.
- Mellanprogram för slutpunktsdirigering (UseEndpoints med MapRazorPages) för att lägga till slutpunkter för Razor Pages i begärandepipelinen.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
I föregående exempelkod exponeras varje middleware-metod på IApplicationBuilder genom Microsoft.AspNetCore.Builder-namnrymden.
UseExceptionHandler är den första mellanprogramskomponenten som läggs till i pipelinen. Därför fångar undantagshanterarens mellanprogram alla undantag som inträffar i senare anrop.
Mellanprogram för statiska filer anropas tidigt i pipelinen så att det kan hantera begäranden och kortslutning utan att gå igenom de återstående komponenterna. Mellanprogrammet för statiska filer utför inga auktoriseringskontroller. Alla filer som hanteras av statiska filmellanprogram, inklusive de under wwwroot, är offentligt tillgängliga. En metod för att skydda statiska filer finns i Hantera statiska filer i ASP.NET Core-appar.
Om begäran inte hanteras av den statiska filmellanprogrammet skickas den vidare till mellanprogrammet för autentisering (UseAuthentication), som utför autentisering. Autentisering kortsluter inte oautentiserade begäranden. Även om autentisering mellanprogram autentiserar begäranden sker auktorisering (och avvisande) först efter att MVC har valt en specifik Razor sida eller MVC-kontrollant och åtgärd.
I följande exempel visas en mellanprogramsordning där begäranden om statiska filer hanteras av statiska filmellanprogram före mellanprogram för svarskomprimering. Statiska filer komprimeras inte med den här mellanprogramsordningen. Svar på sidor Razor kan komprimeras.
public void Configure(IApplicationBuilder app)
{
// Static files aren't compressed by static file middleware.
app.UseStaticFiles();
app.UseRouting();
app.UseResponseCompression();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
För ensidesprogram (SPA) kommer SPA-mellanprogrammet UseSpaStaticFiles vanligtvis sist i pipelinen för mellanprogram. SPA-mellanprogrammet kommer sist:
- För att alla andra mellanprogram ska kunna svara på matchande begäranden först.
- För att tillåta att SPA:er med routning på klientsidan körs för alla vägar som serverappen inte känner igen.
Mer information om SPA finns i guiderna för projektmallarna React och Angular.
Information om ensidesprogram finns i guiderna för projektmallarna React och Angular.
UseCors och UseStaticFiles ordning
Mer information om beställning UseCors och UseStaticFilesfinns i Aktivera CORS (Cross-Origin Requests) i ASP.NET Core.
Vidarebefordrade rubriker mellanprogramsordning
Kör mellanprogramvaran för vidarebefordrade huvuden innan annan mellanprogramvara för att säkerställa att mellanprogramvara som är beroende av information om vidarebefordrade huvuden kan använda huvudvärdena vid bearbetningen. Om du vill köra mellanprogrammet för vidarebefordrade huvuden efter mellanprogrammen för diagnostik och felhantering, kan du läsa ordningen för mellanprogrammet för vidarebefordrade huvuden.
Inbyggda mellanprogram
Den senaste versionen av ASP.NET Core innehåller följande mellanprogram. Kolumnen UI-stack visar den typiska UI-stacken där mellanprogrammet används: [Alla, Blazor Web App (BWA), Razor Pages och MVC (RP/MVC)]. Kolumnen Order innehåller anteckningar om mellanprogramsplacering i pipelinen för bearbetning av begäranden och under vilka villkor mellanprogrammet kan stoppa bearbetningen av begäranden. När ett mellanprogram kortsluter pipelinen för bearbetning av begäranden och hindrar ytterligare underordnade mellanprogram från att bearbeta en begäran kallas det för en terminalmellanprogram. Mer information om kortslutning finns i avsnittet Skapa en mellanprogramspipeline med WebApplication .
| Mellanmjukvara | Beskrivning | UI-stacken | Beställning |
|---|---|---|---|
| Förfalskningsskydd | Tillhandahåller skydd mot förfalskningsförfrågningar. | Allt | Efter autentisering och auktorisering, innan slutpunkterna. |
| autentisering | Tillhandahåller autentiseringsstöd. | Allt | Innan HttpContext.User krävs. Terminal för återanrop till OAuth. |
| auktorisering | Tillhandahåller auktoriseringsstöd. | Allt | Omedelbart efter mellanprogrammet för autentisering. |
| Cookie policy | Spårar medgivande från användare för lagring av personlig information och tillämpar minimistandarder för cookie fält, till exempel secure och SameSite. |
Allt | Före mellanliggande programvara som utfärdar cookies. Exempel: Autentisering, Session, MVC (TempData). |
| CORS | Konfigurerar resursdelning mellan ursprung. | Allt | Före mellanprogram som använder CORS.
UseCors måste gå före UseResponseCaching. Mer information finns i Det är inte klart att UseCORS måste komma före UseResponseCaching (dotnet/aspnetcore #23218. |
| undantagssida för utvecklare | Genererar en sida med felinformation som endast är avsedd att användas i Development miljön. |
Allt | Före mellanprogram som genererar fel. Projektmallarna registrerar automatiskt det här mellanprogrammet som det första mellanprogrammet i pipelinen när miljön är Development. |
| Diagnostik | Flera separata mellanprogram som tillhandahåller en undantagssida för utvecklare, undantagshantering, statuskodsidor och standardwebbsidan för nya appar. | Allt | Före mellanprogram som genererar fel. Terminal för undantagshantering eller visar standardwebbsidan för nya appar. |
| vidarebefordrade rubriker | Vidarebefordrar proxy-headers till den aktuella begäran. | Allt | Före mellanprogram som använder de uppdaterade fälten. Exempel: schema, värd, klient-IP, metod. |
| hälsokontroll | Kontrollerar hälsotillståndet för en ASP.NET Core-app och dess beroenden, till exempel att kontrollera databasens tillgänglighet. | Allt | Terminal om en begäran matchar en slutpunkt för hälsokontroll. |
| Rubrik Spridning | Sprider HTTP-huvuden från den inkommande begäran till utgående HTTP-klientbegäranden. | ||
| Allt | |||
| HTTP-loggning | Loggar HTTP-begäranden och svar. | Allt | I början av pipelinen för mellanprogram. |
| åsidosättning av HTTP-metod | Tillåter att en inkommande POST-begäran åsidosätter metoden. | Allt | Före mellanprogram som använder den uppdaterade metoden. |
| HTTPS-omdirigering | Omdirigerar alla HTTP-begäranden till HTTPS. | Allt | Före mellanprogram som använder URL:en. |
| HTTP Strikt transportskydd (HSTS) | Mellanprogram för säkerhetsförbättringar som lägger till ett särskilt svarshuvud. | Allt | Innan svar skickas och efter mellanprogram som ändrar begäranden. Exempel: Vidarebefordrade rubriker, URL-omskrivning. |
| MVC | Bearbetar begäranden med MVC och Razor Pages. | RP/MVC | Slutpunkt när en förfrågan matchar en rutt. |
| OWIN | Interop med OWIN-baserade appar, servrar och mellanprogram. | RP/MVC | Terminal om OWIN-mellanprogrammet fullständigt bearbetar begäran. |
| cachelagring av utdata | Ger stöd för cachelagringssvar baserat på konfiguration. | RP/MVC | Före mellanprogram som kräver cachelagring. UseRouting, UseCors, UseAuthenticationoch UseAuthorization måste komma före UseOutputCache. |
| Responscache | Ger stöd för cachelagring av svar. Det här mellanprogrammet kräver att klienten deltar för att fungera. Använd cachelagring av utdata för fullständig serverkontroll. | RP/MVC | Före mellanprogram som kräver cachelagring. UseCors måste komma före UseResponseCaching. Cachelagring av svar är vanligtvis inte fördelaktigt för användargränssnittsappar, till exempel Razor Sidor, eftersom webbläsare vanligtvis anger begärandehuvuden som förhindrar cachelagring. Cachelagring av utdata gynnar användargränssnittsappar. |
| Begär dekomprimering | Ger stöd för dekomprimering av begäranden. | Allt | Före mellanprogram som läser begärandetexten. |
| komprimering av svar | Ger stöd för att komprimera svar. | Allt | Före mellanprogram som kräver komprimering. |
| Begär lokaliseringsförfrågan | Tillhandahåller lokaliseringsstöd. | Allt | Före lokalisering av känsligt mellanprogram. Måste visas efter routning av mellanprogram när du använder RouteDataRequestCultureProvider. |
| Tidsgränser för begäranden | Ger stöd för att konfigurera tidsgränser för begäranden, globala och per slutpunkt. | Allt | UseRequestTimeouts måste komma efter UseExceptionHandler, UseDeveloperExceptionPageoch UseRouting. |
| Slutpunktsroutning. | Definierar och begränsar begärandevägar. | Allt | Terminal för matchande rutter. |
| SPA | Hanterar alla begäranden från den här punkten i mellanprogramskedjan genom att returnera standardsidan för spa-programmet (Single Page Application). | Allt | Visas sent i pipelinen, så andra mellanprogram för att hantera statiska filer, till exempel MVC-åtgärder, har företräde. |
| Session | Ger stöd för hantering av användarsessioner. | RP/MVC | Före det mellanprogram som kräver Session. |
| Statisk fil | Ger stöd för att hantera statiska filer och katalogbläddring. | Allt | Terminal om en begäran matchar en fil. |
| URL-omskrivning | Ger stöd för att skriva om URL:er och omdirigera begäranden. | Allt | Före mellanprogram som använder URL:en. |
| W3C-loggning | Genererar serveråtkomstloggar i W3C Extended Log File Format. | Allt | I början av pipelinen för mellanprogram. |
| Blazor WebAssembly Felsökning | Felsöker Blazor Web Apps som använder csr (client-side rendering) i Chromium-utvecklarverktyg. | BWA | I början av pipelinen för mellanprogram. |
| WebSockets | Aktiverar WebSockets-protokollet. | Allt | Före mellanprogram som krävs för att acceptera WebSocket-begäranden. |
Ytterligare resurser
- Alternativ för livslängd och registrering (inklusive mellanprogramsexempel)
- Skriva anpassade ASP.NET Core-mellanprogram
- Testa ASP.NET Core-mellanprogram
- Konfigurera gRPC-Web i ASP.NET Core
- Migrera HTTP-moduler till ASP.NET Core-mellanprogram
- Start av applikation i ASP.NET Core
- begär funktioner i ASP.NET Core
- Fabriksbaserad aktivering av mellanprogram i ASP.NET Core
- Mellanprogramsaktivering med en tredjepartscontainer i ASP.NET Core
- Översikt över API:er
ASP.NET Core