0Pricing
C# Academy · Pelajaran

Middleware & Filter dalam Minimal API

Tambahkan autentikasi, otorisasi, penanganan pengecualian, dan filter endpoint ke alur Minimal API.

Middleware & Filter dalam Minimal API adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.

Perangkat Tengah vs Penyaring Titik Akhir

ASP.NET Core memiliki dua lapisan ekstensibilitas: perangkat tengah (membungkus seluruh alur pemrosesan dan berjalan untuk setiap permintaan) serta penyaring titik akhir (hanya berjalan untuk titik akhir tertentu). Keduanya berfungsi dalam API Minimal.

Menambahkan Perangkat Tengah ke API Minimal

Perangkat tengah ASP.NET Core standar ditambahkan dengan metode app.Use*. Urutannya penting—perangkat tengah berjalan sesuai urutan pendaftarannya.

var app = builder.Build();

app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.UseRateLimiter();

app.MapGet("/secure", () => "Protected endpoint")
   .RequireAuthorization();

app.Run();

Penyaring Titik Akhir Sebaris

Penyaring titik akhir mirip perangkat tengah yang cakupannya terbatas pada satu titik akhir. Gunakan AddEndpointFilter untuk menambahkan penyaring secara langsung. Penyaring dapat menghentikan alur lebih awal dengan mengembalikan hasil tanpa memanggil next.

app.MapGet("/guarded", () => "Secret data")
   .AddEndpointFilter(async (ctx, next) =>
   {
       var header = ctx.HttpContext.Request.Headers["X-Api-Key"];
       if (header != "my-secret-key")
           return Results.Unauthorized();

       return await next(ctx); // proceed to handler
   });

Penyaring Titik Akhir Berbasis Kelas

Implementasikan IEndpointFilter untuk membuat penyaring yang dapat digunakan kembali. Penyaring tersebut dapat diterapkan pada titik akhir individual atau seluruh grup rute.

public class LoggingFilter : IEndpointFilter
{
    private readonly ILogger<LoggingFilter> _logger;
    public LoggingFilter(ILogger<LoggingFilter> logger) => _logger = logger;

    public async ValueTask<object?> InvokeAsync(
        EndpointFilterInvocationContext ctx,
        EndpointFilterDelegate next)
    {
        _logger.LogInformation("Before: {Path}", ctx.HttpContext.Request.Path);
        var result = await next(ctx);
        _logger.LogInformation("After: {Path}",  ctx.HttpContext.Request.Path);
        return result;
    }
}

// Apply to a group
app.MapGroup("/api").AddEndpointFilter<LoggingFilter>();

Perangkat Tengah Penanganan Pengecualian

Gunakan app.UseExceptionHandler atau perangkat tengah ProblemDetails bawaan untuk menangkap pengecualian yang tidak tertangani dan mengembalikan respons masalah RFC 7807.

builder.Services.AddProblemDetails();

var app = builder.Build();

app.UseExceptionHandler();
// OR for custom logic:
app.UseExceptionHandler(errApp =>
    errApp.Run(async ctx =>
    {
        var ex = ctx.Features.Get<IExceptionHandlerFeature>()?.Error;
        ctx.Response.StatusCode = 500;
        await ctx.Response.WriteAsJsonAsync(new { error = ex?.Message });
    }));

Perangkat Tengah Penghentian Alur

Gunakan app.MapShortCircuit() (.NET 8+) atau Results.StatusCode() dalam penyaring untuk segera mengembalikan respons tanpa menjalankan seluruh alur pemrosesan.

// Block known bad bots at the edge
app.MapGet("/robots.txt", () => "User-agent: *\nDisallow: /")
   .ShortCircuit(); // .NET 8: returns response immediately

// Or in a filter:
app.MapGet("/maintenance", () => "OK")
   .AddEndpointFilter((ctx, next) =>
       ValueTask.FromResult<object?>(Results.StatusCode(503)));

Pembatasan Laju di .NET 7+

Perangkat tengah pembatas laju bawaan melindungi titik akhir dari penyalahgunaan. Terapkan kebijakan secara global atau per titik akhir dengan RequireRateLimiting().

using System.Threading.RateLimiting;

builder.Services.AddRateLimiter(opt =>
{
    opt.AddFixedWindowLimiter("fixed", o =>
    {
        o.PermitLimit     = 10;
        o.Window          = TimeSpan.FromSeconds(10);
        o.QueueLimit      = 0;
        o.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
    });
    opt.RejectionStatusCode = StatusCodes.Status429TooManyRequests;
});

app.UseRateLimiter();
app.MapGet("/search", Search).RequireRateLimiting("fixed");

Konfigurasi CORS

Konfigurasikan kebijakan CORS dalam layanan, lalu terapkan secara global atau per titik akhir untuk mengontrol asal yang dapat mengakses API Anda.

builder.Services.AddCors(opt =>
    opt.AddPolicy("AllowFrontend", policy =>
        policy.WithOrigins("https://myapp.com")
              .AllowAnyHeader()
              .AllowAnyMethod()));

app.UseCors("AllowFrontend");

// Or per endpoint:
app.MapGet("/public-data", () => "data")
   .RequireCors("AllowFrontend");

Perangkat Tengah Penyimpanan Respons

AddOutputCache menyimpan respons di sisi server. Terapkan pada titik akhir tertentu agar respons tersimpan dapat disajikan tanpa mengakses basis data pada setiap permintaan.

builder.Services.AddOutputCache();

app.UseOutputCache();

app.MapGet("/products", async (AppDbContext db) =>
    Results.Ok(await db.Products.AsNoTracking().ToListAsync()))
   .CacheOutput(p => p.Expire(TimeSpan.FromMinutes(5)));

Urutan dan Rantai Penyaring

Penyaring dijalankan sesuai urutan penambahannya (paling luar terlebih dahulu, paling dalam terakhir—seperti perangkat tengah). Anda dapat merangkai beberapa penyaring pada titik akhir atau grup yang sama.

app.MapPost("/orders", CreateOrder)
   .AddEndpointFilter<LoggingFilter>()      // runs first
   .AddEndpointFilter<ValidationFilter>()   // runs second
   .AddEndpointFilter<AuthFilter>()         // runs third
   .RequireAuthorization();                 // JWT checked by middleware

Contoh Dunia Nyata: Perangkat Tengah Kunci API

Perangkat tengah kunci API yang dapat digunakan kembali, yang membaca kunci dari tajuk dan menghentikan alur dengan 401 jika kunci tidak valid.

public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;
    private readonly string _expectedKey;

    public ApiKeyMiddleware(RequestDelegate next, IConfiguration cfg)
    {
        _next = next;
        _expectedKey = cfg["ApiKey"] ?? throw new Exception("ApiKey not configured");
    }

    public async Task InvokeAsync(HttpContext ctx)
    {
        if (!ctx.Request.Headers.TryGetValue("X-Api-Key", out var key)
            || key != _expectedKey)
        {
            ctx.Response.StatusCode = 401;
            await ctx.Response.WriteAsync("Invalid API key");
            return;
        }
        await _next(ctx);
    }
}

app.UseMiddleware<ApiKeyMiddleware>();

Pemeriksaan Singkat

Apa perbedaan utama antara perangkat tengah dan penyaring titik akhir dalam API Minimal?

Ringkasan: Perangkat Tengah & Penyaring

Hal-hal penting:

  • Perangkat tengah berjalan secara global sesuai urutan alur pemrosesan untuk setiap permintaan
  • Penyaring titik akhir (AddEndpointFilter) memiliki cakupan pada titik akhir atau grup tertentu
  • Implementasikan antarmuka penyaring titik akhir untuk membuat kelas penyaring yang dapat digunakan kembali dan mendukung DI
  • Perangkat tengah bawaan: pembatasan laju, CORS, penyimpanan respons, dan penanganan pengecualian
  • Urutan penyaring penting—penyaring bertingkat seperti perangkat tengah (yang ditambahkan pertama berada paling luar)

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Middleware & Filter dalam Minimal API” gratis?

Ya — teks lengkap “Middleware & Filter dalam Minimal API” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Middleware & Filter dalam Minimal API”?

Tambahkan autentikasi, otorisasi, penanganan pengecualian, dan filter endpoint ke alur Minimal API. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.

Berapa lama pelajaran “Middleware & Filter dalam Minimal API” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membuat Minimal API Pertama Anda
  2. Grup Rute, Parameter & Validasi
  3. Middleware & Filter dalam Minimal API
  4. OpenAPI, Pemberian Versi & Deployment
← Kembali ke C# Academy