Megosztás a következőn keresztül:


Egyéni ASP.NET Core köztes szoftver írása

Megjegyzés:

Ez nem a cikk legújabb verziója. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .

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 a Func<Task> paraméterek nélkül.
  • A másik egy HttpContext és egy RequestDelegate. Hívja meg a RequestDelegate a HttpContext á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 vagy InvokeAsync. Ennek a módszernek a következőnek kell lennie:
    • Visszaadja a Task.
    • Fogadja el az első típusú HttpContextparamétert.

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

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.

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 vagy InvokeAsync. Ennek a módszernek a következőnek kell lennie:
    • Visszaadja a Task.
    • Fogadja el az első típusú HttpContextparamétert.

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