0Pricing
C# Academy · Ders

Özel Ara Yazılım Yazma

Yeniden kullanılabilir bileşenler için Use/Run/Map ile satır içi ara yazılım, InvokeAsync ile sınıf tabanlı ara yazılım oluşturun.

Özel Ara Yazılım Yazma, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

Özel ara yazılım neden kullanılır?

Özel ara yazılım, birçok isteğe uygulanan ortak kaygıları ele alır: günlük kaydı, zamanlama, hata işleme, kimlik doğrulama, sıkıştırma ve önbelleğe alma. Bu kodu bir kez yazmanız, mantığın eşleşen her istek için otomatik olarak çalışmasını sağlar.

Use ile satır içi ara yazılım

Ara yazılım eklemenin en hızlı yolu, app.Use() yöntemine bir temsilci aktarmaktır. Prototip oluşturmak veya gerçekten basit mantıklar için uygundur.

app.Use(async (context, next) =>
{
    var start = DateTimeOffset.UtcNow;

    await next(context);

    var elapsed = DateTimeOffset.UtcNow - start;
    context.Response.Headers.Append(
        "X-Elapsed", elapsed.TotalMilliseconds.ToString("F0") + "ms");
});

Sınıf tabanlı ara yazılım (geleneksel yaklaşım)

Geleneksel bir ara yazılım sınıfının RequestDelegate alan bir kurucusu ve herkese açık bir InvokeAsync yöntemi vardır. Ek kurucu parametreleri DI tarafından eklenebilir.

public class SecurityHeadersMiddleware
{
    private readonly RequestDelegate _next;

    public SecurityHeadersMiddleware(RequestDelegate next) => _next = next;

    public async Task InvokeAsync(HttpContext context)
    {
        var headers = context.Response.Headers;
        headers.Append("X-Content-Type-Options", "nosniff");
        headers.Append("X-Frame-Options", "DENY");
        headers.Append("X-XSS-Protection", "1; mode=block");
        headers.Append("Referrer-Policy", "strict-origin-when-cross-origin");

        await _next(context);
    }
}

// Extension method for clean registration:
public static class SecurityHeadersExtensions
{
    public static IApplicationBuilder UseSecurityHeaders(
        this IApplicationBuilder app) =>
        app.UseMiddleware<SecurityHeadersMiddleware>();
}

DI kapsamlı bağımlılıkları için IMiddleware

Ara yazılımınızın DbContext gibi kapsamla sınırlı hizmetlere ihtiyacı varsa IMiddleware uygulayın. Bunu kapsamlı olarak kaydedin; çerçeve her istek için yeni bir örnek çözümler.

public class AuditMiddleware : IMiddleware
{
    private readonly AuditDbContext _db;
    private readonly IHttpContextAccessor _http;

    public AuditMiddleware(AuditDbContext db, IHttpContextAccessor http)
    {
        _db = db;
        _http = http;
    }

    public async Task InvokeAsync(HttpContext ctx, RequestDelegate next)
    {
        await next(ctx);

        if (ctx.Request.Method != "GET")
        {
            _db.AuditLogs.Add(new AuditLog
            {
                User   = ctx.User.Identity?.Name,
                Path   = ctx.Request.Path,
                Status = ctx.Response.StatusCode,
                At     = DateTime.UtcNow
            });
            await _db.SaveChangesAsync();
        }
    }
}

builder.Services.AddScoped<AuditMiddleware>();
app.UseMiddleware<AuditMiddleware>();

Seçeneklerle ara yazılım

Yapılandırmayı kurucudaki bir seçenekler nesnesi aracılığıyla ara yazılıma aktarın. Seçenekleri DI kapsayıcısına kaydedin veya ara yazılımı kaydederken satır içinde aktarın.

public class ThrottleOptions
{
    public int MaxRequestsPerSecond { get; set; } = 100;
    public string[] ExcludedPaths { get; set; } = Array.Empty<string>();
}

public class ThrottleMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ThrottleOptions _options;

    public ThrottleMiddleware(RequestDelegate next, ThrottleOptions options)
    {
        _next   = next;
        _options = options;
    }
    // ...
}

// Registration with options:
app.UseMiddleware<ThrottleMiddleware>(new ThrottleOptions
{
    MaxRequestsPerSecond = 50
});

Özel durum işleme ara yazılımı

Özel bir özel durum işleyici ara yazılımı, işlenmemiş tüm özel durumları yakalar ve yapılandırılmış hata yanıtları döndürür.

public class GlobalExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<GlobalExceptionMiddleware> _logger;

    public GlobalExceptionMiddleware(RequestDelegate next, ILogger<GlobalExceptionMiddleware> l)
    {
        _next = next;
        _logger = l;
    }

    public async Task InvokeAsync(HttpContext ctx)
    {
        try { await _next(ctx); }
        catch (NotFoundException ex)
        {
            ctx.Response.StatusCode = 404;
            await ctx.Response.WriteAsJsonAsync(new { error = ex.Message });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Unhandled exception");
            ctx.Response.StatusCode = 500;
            await ctx.Response.WriteAsJsonAsync(new { error = "Internal server error" });
        }
    }
}

İstek günlük kaydı ara yazılımı

Yapılandırılmış bir istek/yanıt günlük kaydı ara yazılımı, her istek için yöntemi, yolu, durum kodunu ve geçen süreyi kaydeder.

public class RequestLoggingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger<RequestLoggingMiddleware> _log;

    public RequestLoggingMiddleware(RequestDelegate n, ILogger<RequestLoggingMiddleware> l)
    { _next = n; _log = l; }

    public async Task InvokeAsync(HttpContext ctx)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        await _next(ctx);
        sw.Stop();

        _log.LogInformation(
            "{Method} {Path} -> {Status} in {Ms}ms",
            ctx.Request.Method,
            ctx.Request.Path,
            ctx.Response.StatusCode,
            sw.ElapsedMilliseconds);
    }
}

UseWhen ile koşullu ara yazılım

UseWhen, işlem hattını kalıcı olarak bölmeden bir koşul ifadesine göre koşullu dallanma yapar. Dal, sonrasında ana işlem hattına yeniden katılır.

// Apply authentication middleware only to /api/* routes
app.UseWhen(
    ctx => ctx.Request.Path.StartsWithSegments("/api"),
    apiApp =>
    {
        apiApp.UseAuthentication();
        apiApp.UseAuthorization();
    });

// Public routes (/public/*) bypass authentication
app.MapGet("/public/health", () => "OK");
app.MapGet("/api/data", [Authorize] async (DataService s) => await s.GetAsync());

Yanıt önbelleğe alma ara yazılımı

Yerleşik yanıt önbelleğe alma ara yazılımı, yanıtların tamamını bellekte saklar. Her uç nokta için önbellek ilkelerini üst bilgileri veya öznitelikleri kullanarak yapılandırın.

builder.Services.AddResponseCaching();

app.UseResponseCaching();

app.MapGet("/products", async (AppDbContext db) =>
{
    var products = await db.Products.AsNoTracking().ToListAsync();
    return Results.Ok(products);
})
.CacheOutput(p => p.Expire(TimeSpan.FromMinutes(2)).Tag("products"));

Gerçek dünya: Bakım modu ara yazılımı

Yapılandırmadan bir bayrak okuyan (IOptionsMonitor aracılığıyla sıcak yeniden yüklemeyi destekleyen) ve bakım sırasında sistem durumu denetimleri dışındaki istekleri reddeden bir bakım modu ara yazılımı.

public class MaintenanceMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IOptionsMonitor<MaintenanceOptions> _options;

    public MaintenanceMiddleware(RequestDelegate next,
        IOptionsMonitor<MaintenanceOptions> opts)
    { _next = next; _options = opts; }

    public async Task InvokeAsync(HttpContext ctx)
    {
        if (_options.CurrentValue.IsEnabled
            && !ctx.Request.Path.StartsWithSegments("/health"))
        {
            ctx.Response.StatusCode = 503;
            ctx.Response.Headers.Append("Retry-After", "300");
            await ctx.Response.WriteAsJsonAsync(
                new { message = "Service under maintenance" });
            return;
        }
        await _next(ctx);
    }
}

Kısa sınama

DbContext gibi kapsamla sınırlı bir hizmete ihtiyaç duyduğunuzda, geleneksel yaklaşım yerine neden IMiddleware uygulamalısınız?

Özet: Özel ara yazılım yazma

Ana çıkarımlar:

  • Satır içi (Use temsilcisi): hızlı, tek satırlık işlemler; sınıf tabanlı: yeniden kullanılabilir, sınanabilir
  • Geleneksel sınıf: kurucu RequestDelegate alır; InvokeAsync(HttpContext)
  • IMiddleware: istek başına DI çözümlemesi — kapsamla sınırlı bağımlılıklar için gereklidir
  • UseWhen: ana işlem hattına yeniden katılan koşullu dallanma
  • Tüm hataları yakalamak için özel durum işleme ara yazılımını ilk sıraya (en dışa) yerleştirin
  • Temiz ve keşfedilebilir kayıt için genişletme yöntemleri (UseXxx) oluşturun

Sıkça Sorulan Sorular

“Özel Ara Yazılım Yazma” dersi ücretsiz mi?

Evet — “Özel Ara Yazılım Yazma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“Özel Ara Yazılım Yazma” dersinde ne öğreneceğim?

Yeniden kullanılabilir bileşenler için Use/Run/Map ile satır içi ara yazılım, InvokeAsync ile sınıf tabanlı ara yazılım oluşturun. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Özel Ara Yazılım Yazma” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. ASP.NET Core İşlem Hattına Genel Bakış
  2. Özel Ara Yazılım Yazma
  3. Kısa Devreye Alma ve Dallanma
  4. Ara Yazılım Sıralaması ve Yerleşik Ara Yazılım
← C# Academy Sayfasına Dön