ASP.NET Core İşlem Hattına Genel Bakış
İsteklerin ara yazılım işlem hattı ve HttpContext üzerinden nasıl aktığını, yanıtların nasıl oluşturulduğunu anlayın.
ASP.NET Core İşlem Hattına Genel Bakış, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. 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.
İstek işlem hattı
ASP.NET Core'daki her HTTP isteği bir ara yazılım işlem hattından geçer. Her ara yazılım parçası isteği inceleyebilir, değiştirebilir, kısa devre yapabilir veya sonraki bileşene iletebilir. Bu işlem hattını anlamak, ASP.NET Core uygulamaları oluşturmanın temelidir.
HttpContext: İstek zarfı
HttpContext, istek ve yanıtla ilgili her şeyi taşır: üst bilgileri, çerezleri, gövdeyi, kullanıcı taleplerini, bağlantı bilgilerini ve iptal belirtecini. Tüm ara yazılımlar bunun üzerinde çalışır.
app.Use(async (context, next) =>
{
// Read request info
var method = context.Request.Method;
var path = context.Request.Path;
var headers = context.Request.Headers;
var user = context.User.Identity?.Name;
// Write to response
context.Response.Headers.Append("X-Processed-By", "MyMiddleware");
await next(context); // forward to next middleware
});Ara yazılım kayıt sırası
Ara yazılım, kaydedildiği sırayla çalışır. Yanıt ise ters sırada açılır (yığın gibi). Sıra kritik önem taşır: kimlik doğrulama, yetkilendirmeden önce çalışmalıdır; yönlendirme, uç nokta eşleştirmesinden önce gelmelidir.
// Typical order for an ASP.NET Core app:
app.UseExceptionHandler("/error"); // outermost — catches everything
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseCors("policy");
app.UseAuthentication(); // must be before Authorization
app.UseAuthorization();
app.UseRateLimiter();
app.UseOutputCache();
// MapHub, MapControllers, MapGet etc.
app.Run();Use, Run ve Map
Üç yöntem ara yazılım ekler: Use (sonrakini çağırır), Run (sonlandırıcıdır, sonraki bileşeni NEVER çağırır) ve Map (yola göre dallanır).
// Use: passes to next
app.Use(async (ctx, next) =>
{
Console.WriteLine("Before");
await next(ctx);
Console.WriteLine("After");
});
// Run: terminal — no next
app.Run(async ctx =>
await ctx.Response.WriteAsync("Terminal"));
// Map: branch on path prefix
app.Map("/api", apiApp =>
apiApp.Run(async ctx =>
await ctx.Response.WriteAsync("API branch")));İstek ve yanıt gövdeleri
İstek ve yanıt gövdeleri akışlardır. İstek gövdesi yalnızca bir kez okunabilir — birden fazla kez okumanız gerekiyorsa (ör. birden çok ara yazılımda) istek gövdesi arabelleğe almayı etkinleştirin.
app.Use(async (ctx, next) =>
{
// Enable buffering so body can be read multiple times
ctx.Request.EnableBuffering();
using var reader = new StreamReader(
ctx.Request.Body,
leaveOpen: true);
var body = await reader.ReadToEndAsync();
ctx.Request.Body.Position = 0; // rewind for next middleware
Console.WriteLine($"Body: {body}");
await next(ctx);
});İşlem hattında kısa devre
Ara yazılım, yanıtı yazarak ve next çağrısını NOT yaparak işlem hattında kısa devre oluşturabilir. Bu, kimlik doğrulama geçitleri, sistem durumu denetimleri veya bakım sayfaları için kullanışlıdır.
app.Use(async (ctx, next) =>
{
if (ctx.Request.Path == "/maintenance")
{
ctx.Response.StatusCode = 503;
await ctx.Response.WriteAsync("Service under maintenance");
return; // short-circuit — next is NOT called
}
await next(ctx);
});IMiddleware arayüzü
DI gerektiren sınıf tabanlı ara yazılımlar için IMiddleware uygulayın. Uygulamayı DI'ya kaydedin ve app.UseMiddleware<T>() kullanın.
public class RequestTimingMiddleware : IMiddleware
{
private readonly ILogger<RequestTimingMiddleware> _logger;
public RequestTimingMiddleware(ILogger<RequestTimingMiddleware> l) => _logger = l;
public async Task InvokeAsync(HttpContext ctx, RequestDelegate next)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
await next(ctx);
_logger.LogInformation("{Method} {Path}: {Ms}ms",
ctx.Request.Method, ctx.Request.Path, sw.ElapsedMilliseconds);
}
}
// Register:
builder.Services.AddTransient<RequestTimingMiddleware>();
app.UseMiddleware<RequestTimingMiddleware>();Geleneksel ara yazılım sınıfları
Alternatif olarak InvokeAsync(HttpContext, RequestDelegate) yöntemine sahip bir sınıf oluşturun. Çerçeve, bağımlılıkları (sonraki temsilci de dahil) kurucu aracılığıyla ekler.
public class ApiKeyMiddleware
{
private readonly RequestDelegate _next;
private readonly string _key;
// RequestDelegate injected by framework
public ApiKeyMiddleware(RequestDelegate next, IConfiguration cfg)
{
_next = next;
_key = cfg["ApiKey"] ?? "";
}
public async Task InvokeAsync(HttpContext ctx)
{
if (ctx.Request.Headers["X-Api-Key"] != _key)
{
ctx.Response.StatusCode = 401;
return;
}
await _next(ctx);
}
}Next sonrasında yanıtları değiştirme
await next(ctx) sonrasındaki kod, yanıt yazılmaya başladıktan sonra çalışır. Yanıt üst bilgilerini next çağrısından önce ekleyebilirsiniz; ancak bundan sonra durum kodunu veya gövdeyi değiştiremezsiniz.
app.Use(async (ctx, next) =>
{
// Before: add response headers (safe)
ctx.Response.OnStarting(() =>
{
ctx.Response.Headers.Append("X-Request-Id",
Guid.NewGuid().ToString("N"));
return Task.CompletedTask;
});
await next(ctx);
// After: response may already be sent
// SAFE: logging, metrics
// UNSAFE: changing status code or writing body
Console.WriteLine($"Response status: {ctx.Response.StatusCode}");
});Gerçek dünya: Correlation ID ara yazılımı
Dağıtık izleme ve günlük kaydı için her isteğe bir izleme kimliği ekleyen, üretim ortamına uygun bir ilişkilendirme kimliği ara yazılımı.
public class CorrelationIdMiddleware
{
private readonly RequestDelegate _next;
private const string Header = "X-Correlation-Id";
public CorrelationIdMiddleware(RequestDelegate next) => _next = next;
public async Task InvokeAsync(HttpContext ctx)
{
var correlationId = ctx.Request.Headers[Header].FirstOrDefault()
?? Guid.NewGuid().ToString("N");
ctx.Items["CorrelationId"] = correlationId;
ctx.Response.OnStarting(() =>
{
ctx.Response.Headers.Append(Header, correlationId);
return Task.CompletedTask;
});
using (Serilog.Context.LogContext.PushProperty("CorrelationId", correlationId))
await _next(ctx);
}
}Kısa sınama
Ara yazılım eklerken app.Use() ile app.Run() arasındaki fark nedir?
Özet: ASP.NET Core işlem hattına genel bakış
Ana çıkarımlar:
- Ara yazılım kayıt sırasıyla çalışır; yanıtlar ters sırada açılır
Use→nextçağrılır;Run→ sonlandırıcıdır;Map→ yola göre dallanırHttpContextistek, yanıt, kullanıcı ve iptal belirtecini içerir- İstek gövdesini birden çok kez okumak için arabelleğe almayı etkinleştirin
IMiddlewarearayüzü, DI dostu sınıf tabanlı ara yazılımlar sağlar- Yanıt üst bilgilerini
OnStarting()aracılığıyla ekleyin;nextsonrasında durumu değiştirmeyin
Sıkça Sorulan Sorular
“ASP.NET Core İşlem Hattına Genel Bakış” dersi ücretsiz mi?
Evet — “ASP.NET Core İşlem Hattına Genel Bakış” 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.
“ASP.NET Core İşlem Hattına Genel Bakış” dersinde ne öğreneceğim?
İsteklerin ara yazılım işlem hattı ve HttpContext üzerinden nasıl aktığını, yanıtların nasıl oluşturulduğunu anlayın. 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 1. dersidir.
“ASP.NET Core İşlem Hattına Genel Bakış” 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
- ASP.NET Core İşlem Hattına Genel Bakış
- Özel Ara Yazılım Yazma
- Kısa Devreye Alma ve Dallanma
- Ara Yazılım Sıralaması ve Yerleşik Ara Yazılım