Penghentian Singkat & Percabangan
Gunakan MapWhen, UseWhen, dan middleware terminal untuk mencabangkan atau mengakhiri alur berdasarkan kondisi permintaan.
Penghentian Singkat & Percabangan 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.
Percabangan dan Penghentian Alur
Tidak setiap permintaan perlu melewati seluruh alur middleware. ASP.NET Core menyediakan alat untuk membuat percabangan (mengarahkan subset rute ke alur yang berbeda) dan menghentikan alur lebih awal (menghentikan pemrosesan lalu segera mengembalikan respons).
Map: Cabang Permanen Berdasarkan Jalur
Map membuat cabang permanen — permintaan yang cocok dengan awalan akan masuk ke cabang tersebut dan NEVER kembali ke alur utama.
app.Map("/api", apiApp =>
{
apiApp.UseAuthentication();
apiApp.UseAuthorization();
apiApp.Run(async ctx =>
await ctx.Response.WriteAsync("API branch"));
});
// Requests to /api/... enter the branch above.
// Requests to /public/... skip the branch entirely.
app.Run(async ctx =>
await ctx.Response.WriteAsync("Main pipeline"));MapWhen: Percabangan Berdasarkan Predikat
MapWhen membuat percabangan berdasarkan kondisi apa pun, seperti header, parameter kueri, atau logika khusus. Seperti Map, cabang ini bersifat permanen dan tidak bergabung kembali ke alur utama.
// Branch when a specific header is present
app.MapWhen(
ctx => ctx.Request.Headers.ContainsKey("X-Internal"),
internalApp =>
{
internalApp.UseMiddleware<InternalApiMiddleware>();
internalApp.Run(async ctx =>
await ctx.Response.WriteAsync("Internal route"));
});
// Branch on query parameter
app.MapWhen(
ctx => ctx.Request.Query.ContainsKey("legacy"),
legacyApp => legacyApp.UseMiddleware<LegacyHandlerMiddleware>());UseWhen: Cabang Bersyarat yang Bergabung Kembali
UseWhen mirip dengan MapWhen, tetapi cabangnya bergabung kembali ke alur utama setelah selesai. Dengan demikian, Anda dapat menambahkan middleware secara bersyarat tanpa membuat percabangan permanen.
// Log only for authenticated API calls; public routes not logged
app.UseWhen(
ctx => ctx.Request.Path.StartsWithSegments("/api")
&& ctx.User.Identity?.IsAuthenticated == true,
loggedApp =>
{
loggedApp.UseMiddleware<AuditMiddleware>();
});
// All requests continue here after the branch
app.UseRouting();
app.MapControllers();Menghentikan Alur dengan Tidak Memanggil next
Middleware apa pun dapat menghentikan alur lebih awal dengan menulis respons dan tidak memanggil next. Alur berhenti pada titik tersebut dan respons dikembalikan kepada klien.
app.Use(async (ctx, next) =>
{
// IP allowlist check
var ip = ctx.Connection.RemoteIpAddress?.ToString();
var allowed = new[] { "127.0.0.1", "::1", "10.0.0.0/8" };
if (!IsAllowed(ip, allowed))
{
ctx.Response.StatusCode = 403;
await ctx.Response.WriteAsJsonAsync(
new { error = "Access denied from this IP" });
return; // short-circuit
}
await next(ctx); // proceed
});ShortCircuit() di .NET 8
Di .NET 8, MapShortCircuit dan ekstensi ShortCircuit() pada titik akhir menyediakan jalur penghentian alur yang deklaratif dan sangat dioptimalkan.
// Reject known bad paths immediately — skip entire pipeline
app.MapShortCircuit(404, "robots.txt", "favicon.ico");
// Or on a specific endpoint:
app.MapGet("/health", () => "OK")
.ShortCircuit(); // skips auth, rate limiting, etc.
// 'Run' middleware also short-circuits:
app.Map("/old-api", old =>
old.Run(ctx =>
{
ctx.Response.StatusCode = 301;
ctx.Response.Headers.Location = "/api/v2";
return Task.CompletedTask;
}));Middleware Terminal vs Perutean Titik Akhir
Sebelum .NET 3, app.Run() merupakan satu-satunya opsi terminal. Kini, perutean titik akhir (MapGet, MapControllers) lebih disarankan — perutean ini berpartisipasi dalam otorisasi, pembatasan laju, dan metadata.
// OLD: terminal middleware
app.Run(async ctx => {
if (ctx.Request.Path == "/ping")
await ctx.Response.WriteAsync("pong");
});
// PREFERRED: endpoint routing
app.MapGet("/ping", () => "pong")
.WithTags("Health")
.AllowAnonymous()
.RequireRateLimiting("basic");Nuansa Pencocokan Jalur
Map("/api") cocok dengan /api dan /api/anything. Jalur yang cocok dihapus dari Request.Path dalam cabang tersebut dan ditempatkan di Request.PathBase.
app.Map("/api", apiApp =>
{
apiApp.Use(async (ctx, next) =>
{
// Path in branch: /users/42 (prefix removed)
Console.WriteLine(ctx.Request.Path); // /users/42
Console.WriteLine(ctx.Request.PathBase); // /api
await next(ctx);
});
apiApp.MapGet("/users/{id}", (int id) => id);
});Menggabungkan Pola Percabangan
Aplikasi nyata menggabungkan Map, UseWhen, dan penghentian alur lebih awal untuk membuat alur berlapis: rute publik bersifat ringan, rute API memiliki autentikasi, dan rute admin memiliki pemeriksaan tambahan.
// Public area — no auth
app.Map("/public", pub =>
{
pub.MapGet("/health", () => "OK");
pub.MapGet("/docs", () => "Documentation");
});
// API area — full auth + rate limiting
app.Map("/api", api =>
{
api.UseAuthentication();
api.UseAuthorization();
api.UseRateLimiter();
api.MapControllers();
});
// Admin area — require admin role
app.Map("/admin", admin =>
{
admin.UseAuthentication();
admin.UseAuthorization();
admin.MapControllers().RequireAuthorization("AdminPolicy");
});Di Dunia Nyata: Middleware Pengujian A/B
Middleware pengujian A/B mengarahkan permintaan ke penangan yang berbeda berdasarkan kuki atau header, tanpa mengubah kode titik akhir.
app.UseWhen(
ctx => ctx.Request.Cookies.TryGetValue("ab-group", out var g) && g == "B",
betaApp =>
{
betaApp.Use(async (ctx, next) =>
{
ctx.Items["IsGroupB"] = true;
await next(ctx);
});
});
// Endpoint reads the flag:
app.MapGet("/products", (HttpContext ctx, ProductService svc) =>
{
bool isB = ctx.Items.ContainsKey("IsGroupB");
return isB ? svc.GetNewLayoutAsync() : svc.GetOldLayoutAsync();
});Pemeriksaan Singkat
Apa perbedaan utama antara MapWhen dan UseWhen?
Rangkuman: Penghentian Alur & Percabangan
Inti penting:
Map: cabang permanen berdasarkan jalur, tanpa bergabung kembaliMapWhen: cabang permanen berdasarkan predikatUseWhen: cabang bersyarat yang bergabung kembali ke alur utama- Penghentian alur: jangan panggil
next, tulis respons, lalu kembalikan ShortCircuit()(.NET 8): titik akhir terminal yang deklaratif dan dioptimalkan- Gabungkan percabangan untuk membangun alur berlapis: publik / API / admin
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Penghentian Singkat & Percabangan” gratis?
Ya — teks lengkap “Penghentian Singkat & Percabangan” 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 “Penghentian Singkat & Percabangan”?
Gunakan MapWhen, UseWhen, dan middleware terminal untuk mencabangkan atau mengakhiri alur berdasarkan kondisi permintaan. 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 “Penghentian Singkat & Percabangan” 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
- Gambaran Umum Alur ASP.NET Core
- Menulis Middleware Kustom
- Penghentian Singkat & Percabangan
- Urutan Middleware & Middleware Bawaan