özel ASP.NET Core ara yazılımı yaz

By Rick Anderson ve Steve Smith

Ara yazılım, istekleri ve yanıtları işlemek için bir uygulama ardışık düzenine çevrilmiş yazılımdır. ASP.NET Core, zengin bir yerleşik ara yazılım bileşenleri kümesi sağlar, ancak bazı senaryolarda özel bir ara yazılım yazmak isteyebilirsiniz.

Not

Bu konuda, kural tabanlı ara yazılım yazma açıklanmaktadır. Güçlü yazma ve istek başına etkinleştirme kullanan bir yaklaşım için bkz ASP.NET Core 'de fabrika tabanlı ara yazılım etkinleştirmesi ..

Ara yazılım sınıfı

Ara yazılım genellikle bir sınıfta kapsüllenir ve bir genişletme yöntemiyle birlikte sunulur. Bir sorgu dizesinden geçerli istek için kültürü ayarlayan aşağıdaki ara yazılımı göz önünde bulundurun:

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}");
        });

    }
}

Yukarıdaki örnek kod, bir ara yazılım bileşeni oluşturmayı göstermek için kullanılır. ASP.NET Core yerleşik yerelleştirme desteği için bkz ASP.NET Core'de genelleştirme ve yerelleştirme ..

Kültürü geçirerek, ara yazılımı test edin. Örneğin, istek https://localhost:5001/?culture=no .

Aşağıdaki kod, ara yazılım temsilcisini bir sınıfa taşıtabilirler:

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);
        }
    }
}

Ara yazılım sınıfı şunları içermelidir:

  • Türünde bir parametreye sahip ortak Oluşturucu RequestDelegate .
  • Veya adlı bir genel Invoke Yöntem InvokeAsync . Bu yöntem şunları içermelidir:
    • Bir döndürür Task .
    • Türünde bir ilk parametreyi kabul edin HttpContext .

Oluşturucuya yönelik ek parametreler ve Invoke / InvokeAsync bağımlılık ekleme (dı)tarafından doldurulur.

Ara yazılım bağımlılıkları

Ara yazılım, bağımlılıklarındaki bağımlılıklarını açığa çıkararak Açık bağımlılıklar ilkesini izlemelidir. Ara yazılım, uygulama ömrü başına bir kez oluşturulur. Bir istek içindeki ara yazılım ile hizmetleri paylaşmanız gerekiyorsa, Istek başına ara yazılım bağımlılıkları bölümüne bakın.

Ara yazılım bileşenleri, bağımlılık ekleme (dı) öğesinden Oluşturucu parametreleri aracılığıyla bağımlılıklarını çözümleyebilir. Useara yazılım < T > ayrıca ek parametreleri doğrudan kabul edebilir.

İstek başına ara yazılım bağımlılıkları

Ara yazılım uygulama başlangıcında oluşturulduğundan, isteğe göre değil, ara yazılım oluşturucuları tarafından kullanılan kapsamlı ömür Hizmetleri, her istek sırasında bağımlılığı eklenen diğer türlerle paylaşılmaz. Bir kapsamlı hizmeti, ara yazılım ve diğer türler arasında paylaşmanız gerekiyorsa, bu Hizmetleri Invoke metodun imzasına ekleyin. InvokeYöntemi, dı tarafından doldurulan ek parametreleri kabul edebilir:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // IMyScopedService is injected into Invoke
    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
    {
        svc.MyProperty = 1000;
        await _next(httpContext);
    }
}

Ömür ve kayıt seçenekleri , kapsamlı ömür Hizmetleri olan bir ara yazılım örneğinin tamamını içerir.

Ara yazılım genişletme yöntemi

Aşağıdaki genişletme yöntemi, ara yazılımı aracılığıyla kullanıma sunar IApplicationBuilder :

using Microsoft.AspNetCore.Builder;

namespace Culture
{
    public static class RequestCultureMiddlewareExtensions
    {
        public static IApplicationBuilder UseRequestCulture(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<RequestCultureMiddleware>();
        }
    }
}

Aşağıdaki kod, içindeki ara yazılımı çağırır Startup.Configure :

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseRequestCulture();

        app.Run(async (context) =>
        {
            await context.Response.WriteAsync(
                $"Hello {CultureInfo.CurrentCulture.DisplayName}");
        });
    }
}

Ek kaynaklar