Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .
Fontos
Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.
A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .
Készítette: Fiyaz Hasan, Rick Anderson és Steve Smith
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. ASP.NET Core számos beépített köztes szoftverösszetevőt biztosít, de bizonyos esetekben érdemes lehet egyéni köztes szoftvereket írni.
Ez a témakör azt ismerteti, hogyan írhat konvencióalapú köztes szoftvereket. Az erős gépelést és kérésenkénti aktiválást használó megközelítésért lásd: Gyári alapú köztes szoftver aktiválása a ASP.NET Core-ban.
Köztes szoftverosztály
A köztes szoftver általában egy osztályba van beágyazva, és bővítménymetódussal van elérhetővé téve. Vegye figyelembe a következő beágyazott köztes szoftvert, amely egy lekérdezési sztringből állítja be az aktuális kérés kultúráját:
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
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(context);
});
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"CurrentCulture.DisplayName: {CultureInfo.CurrentCulture.DisplayName}");
});
app.Run();
Az előző kiemelt közvetlen köztes szoftver a Microsoft.AspNetCore.Builder.UseExtensions.Use hívásával történő összetevő készítés bemutatására szolgál. Az előző Use
bővítménymetódus egy soron belül definiált köztesszoftver-delegáltat ad hozzá az alkalmazás kérési folyamatához.
A Use
kiterjesztéshez két túlterheléses változat érhető el:
- Az egyik HttpContext-t és egy
Func<Task>
-t vesz. Hívja meg aFunc<Task>
paraméterek nélkül. - A másik egy
HttpContext
és egy RequestDelegate. Hívja meg aRequestDelegate
aHttpContext
átadásával.
Előnyben részesítse a későbbi túlterhelési lehetőséget, mivel a másik túlterhelési lehetőség használatakor szükséges két belső, kérésenkénti erőforrás-foglalást megspórolja.
Tesztelje a köztes szoftvert a kultúra paraméter átadásával. Például kérés https://localhost:5001/?culture=es-es
.
A ASP.NET Core beépített honosítási támogatásáról lásd: Globalization and localization in ASP.NET Core.
A következő kód egy osztályba helyezi át a köztes szoftver delegáltját:
using System.Globalization;
namespace Middleware.Example;
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
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(context);
}
}
A köztes szoftverosztálynak a következőket kell tartalmaznia:
- Nyilvános konstruktor típusparaméterrel RequestDelegate.
- Egy nyilvános metódus neve
Invoke
vagyInvokeAsync
. Ennek a módszernek a következőnek kell lennie:- Visszaadja a
Task
. - Fogadja el az első típusú HttpContextparamétert.
- Visszaadja a
A konstruktor Invoke
/InvokeAsync
további paramétereit függőséginjektálás (DI) tölti ki.
Általában egy bővítménymetódus jön létre, amely a köztes szoftvert a következő módon IApplicationBuilderteszi elérhetővé:
using System.Globalization;
namespace Middleware.Example;
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
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(context);
}
}
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
A következő kód meghívja a köztes szoftvert Program.cs
:
using Middleware.Example;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
app.UseRequestCulture();
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"CurrentCulture.DisplayName: {CultureInfo.CurrentCulture.DisplayName}");
});
app.Run();
Köztes szoftverfüggőségek
A köztes szoftvernek az explicit függőségek elvét kell követnie azáltal, hogy felfedi a függőségeit a konstruktorban. A köztes szoftver az alkalmazás élettartama alatt egyszer jön létre.
A köztes szoftverösszetevők konstruktorparamétereken keresztül feloldhatják függőségeiket a függőséginjektálástól (DI). UseMiddleware közvetlenül is elfogadhat további paramétereket.
Kérelemenkénti köztes szoftverfüggőségek
A köztes szoftver az alkalmazás indításakor jön létre, ezért az alkalmazás élettartamával rendelkezik. A köztesszoftver-konstruktorok által használt hatóköralapú élettartam-szolgáltatások nem lesznek megosztva más függőségi injektált típusokkal az egyes kérések során. Ha meg szeretne osztani egy hatókörrel rendelkező szolgáltatást a köztes szoftver és más típusok között, adja hozzá ezeket a szolgáltatásokat a InvokeAsync
metódus aláírásához. A InvokeAsync
metódus a DI által feltöltött további paramétereket is elfogadhatja:
namespace Middleware.Example;
public class MyCustomMiddleware
{
private readonly RequestDelegate _next;
public MyCustomMiddleware(RequestDelegate next)
{
_next = next;
}
// IMessageWriter is injected into InvokeAsync
public async Task InvokeAsync(HttpContext httpContext, IMessageWriter svc)
{
svc.Write(DateTime.Now.Ticks.ToString());
await _next(httpContext);
}
}
public static class MyCustomMiddlewareExtensions
{
public static IApplicationBuilder UseMyCustomMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<MyCustomMiddleware>();
}
}
Az élettartam és a regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazzák a hatókörön belüli élettartam-szolgáltatásokkal .
A rendszer a következő kódot használja az előző köztes szoftver teszteléséhez:
using Middleware.Example;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<IMessageWriter, LoggingMessageWriter>();
var app = builder.Build();
app.UseHttpsRedirection();
app.UseMyCustomMiddleware();
app.MapGet("/", () => "Hello World!");
app.Run();
A IMessageWriter
felület és a megvalósítás:
namespace Middleware.Example;
public interface IMessageWriter
{
void Write(string message);
}
public class LoggingMessageWriter : IMessageWriter
{
private readonly ILogger<LoggingMessageWriter> _logger;
public LoggingMessageWriter(ILogger<LoggingMessageWriter> logger) =>
_logger = logger;
public void Write(string message) =>
_logger.LogInformation(message);
}
További erőforrások
- A cikkben használt mintakód
- UseExtensions-forrás a GitHubon
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- RÉSZLETES ELEMZÉS: HOGYAN ÉPÜL FEL A ASP.NET CORE MIDDLEWARE-FOLYAMAT
- ASP.NET Core Middleware
- ASP.NET Core köztes szoftver tesztelése
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core
A middleware olyan szoftver, amely alkalmazási csővezetékbe van integrálva a kérések és válaszok kezelésére. ASP.NET Core számos beépített köztes szoftverösszetevőt biztosít, de bizonyos esetekben érdemes lehet egyéni köztes szoftvereket írni.
Megjegyzés:
Ez a témakör azt ismerteti, hogyan írhat konvencióalapú köztes szoftvereket. Az erős gépelést és kérésenkénti aktiválást használó megközelítésért lásd: Gyári alapú köztes szoftver aktiválása a ASP.NET Core-ban.
Köztes szoftverosztály
A köztes szoftver általában egy osztályba van beágyazva, és bővítménymetódussal van elérhetővé téve. Vegye figyelembe a következő köztes szoftvert, amely egy lekérdezési sztringből állítja be az aktuális kérés kultúráját:
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}");
});
}
}
Az előző mintakód egy köztes szoftverösszetevő létrehozásának bemutatására szolgál. A ASP.NET Core beépített honosítási támogatásáról lásd: Globalization and localization in ASP.NET Core.
Tesztelje a közbenső szoftvert a kulturális beállítások megadásával. Például: kérés https://localhost:5001/?culture=no
.
A következő kód egy osztályba helyezi át a köztes szoftver delegáltját:
using Microsoft.AspNetCore.Http;
using System.Globalization;
using System.Threading.Tasks;
namespace Culture
{
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
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(context);
}
}
}
A köztes szoftverosztálynak a következőket kell tartalmaznia:
- Nyilvános konstruktor típusparaméterrel RequestDelegate.
- Egy nyilvános metódus neve
Invoke
vagyInvokeAsync
. Ennek a módszernek a következőnek kell lennie:- Visszaadja a
Task
. - Fogadja el az első típusú HttpContextparamétert.
- Visszaadja a
A konstruktor Invoke
/InvokeAsync
további paramétereit függőséginjektálás (DI) tölti ki.
Middleware-függőségek
A köztes szoftvernek az explicit függőségek elvét kell követnie azáltal, hogy felfedi a függőségeit a konstruktorban. A köztes szoftver az alkalmazás élettartama alatt egyszer jön létre. Ha egy kérésen belül meg kell osztania a szolgáltatásokat a köztes szoftverrel, tekintse meg a kérelem szerinti köztesszoftver-függőségek szakaszt.
A köztes szoftverösszetevők konstruktorparamétereken keresztül feloldhatják függőségeiket a függőséginjektálástól (DI). UseMiddleware közvetlenül is elfogadhat további paramétereket.
Kérelemenkénti köztes szoftverfüggőségek
Mivel a köztes szoftver az alkalmazás indításakor jön létre, nem kérésenként, a köztes szoftver konstruktorai által használt hatóköralapú élettartam-szolgáltatások nem lesznek megosztva más függőségi injektált típusokkal az egyes kérések során. Ha meg kell osztania egy hatókörrel rendelkező szolgáltatást a köztes szoftver és más típusok között, adja hozzá ezeket a szolgáltatásokat a InvokeAsync
metódus aláírásához. A InvokeAsync
metódus a DI által feltöltött további paramétereket is elfogadhatja:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
// IMyScopedService is injected into InvokeAsync
public async Task InvokeAsync(HttpContext httpContext, IMyScopedService svc)
{
svc.MyProperty = 1000;
await _next(httpContext);
}
}
Az élettartam és a regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazzák a hatókörön belüli élettartam-szolgáltatásokkal .
Köztes szoftverkiterjesztési módszer
A következő bővítménymetódus a köztes szoftvereket a következő módon IApplicationBuilderteszi elérhetővé:
using Microsoft.AspNetCore.Builder;
namespace Culture
{
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
}
A következő kód meghívja a köztes szoftvert Startup.Configure
:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseRequestCulture();
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"Hello {CultureInfo.CurrentCulture.DisplayName}");
});
}
}
További erőforrások
- élettartam- és regisztrációs lehetőségek a köztes szoftver teljes mintáját tartalmazza, hatókörrel rendelkező, átmenetiés egyszeri élettartam-szolgáltatásokkal.
- ASP.NET Core Middleware
- ASP.NET Core köztes szoftver tesztelése
- HTTP-modulok migrálása ASP.NET Core köztes szoftverbe
- alkalmazás indítása a ASP.NET Core
- Kért funkciók az ASP.NET Core-ban
- Factory alapú middleware aktiválás ASP.NET Core-ban
- Köztes szoftver aktiválása harmadik féltől származó tárolóval az ASP.NET Core