ASP.NET Core'da middleware pipeline nasıl çalışır? Use, Run ve Map farkı nedir, sıralama neden önemlidir?

Cevap

ASP.NET Core'da her HTTP isteği, Program.cs'te eklendiği sırayla çalışan middleware'lerden geçer. Her middleware isteği işleyip next() ile bir sonrakine aktarabilir veya pipeline'ı kısa devre yapıp (short-circuit) yanıtı kendisi dönebilir. Yanıt, aynı zincirden ters sırayla geri döner.

var app = builder.Build();

app.UseExceptionHandler("/error"); // en dışta: sonraki her şeyin hatasını yakalar
app.UseHttpsRedirection();
app.UseStaticFiles();              // statik dosyada kısa devre yapar
app.UseRouting();
app.UseCors();
app.UseAuthentication();           // kim olduğunu belirler
app.UseAuthorization();            // yetkisini kontrol eder
app.MapControllers();              // endpoint

app.Run();

Use, Run, Map

  • Use: next delegesini alır; öncesinde ve sonrasında kod çalıştırabilir.
  • Run: terminal middleware'dir, next yoktur; pipeline orada biter.
  • Map / MapWhen: path veya koşula göre pipeline'ı dallandırır.
app.Use(async (context, next) =>
{
    var sw = Stopwatch.StartNew();
    await next(context);                      // sonraki middleware'ler
    logger.LogInformation("{Path} {Ms}ms",
        context.Request.Path, sw.ElapsedMilliseconds);
});

Sıralama hataları

  • UseAuthorization UseAuthentication'dan önce gelirse kullanıcı her zaman anonim görünür.
  • UseExceptionHandler sonda olursa önceki middleware'lerin hataları yakalanmaz.
  • UseCors, UseRouting'den sonra ve auth'tan önce olmalıdır.
  • Yanıt gövdesi yazılmaya başladıktan sonra (Response.HasStarted) header değiştirilemez.

Kendi middleware'inizi IMiddleware arayüzü veya InvokeAsync(HttpContext, RequestDelegate) içeren bir sınıfla yazıp app.UseMiddleware<T>() ile eklersiniz.

  1. .NET'te Garbage Collector nasıl çalışır? Generation'lar, Large Object Heap ve IDisposable ilişkisini açıklayın.ZorC# & .NETBackend
  2. EF Core'da change tracking nasıl çalışır? AsNoTracking ne zaman kullanılır ve N+1 problemi nasıl önlenir?OrtaC# & .NETBackend
  3. IEnumerable<T> ile IQueryable<T> arasındaki fark nedir? EF Core'da yanlış kullanım ne gibi sorunlara yol açar?KolayC# & .NETBackend
  4. LINQ'te deferred execution nedir? Aşağıdaki kodun çıktısı ne olur?OrtaC# & .NETBackend
  5. async/await kullanırken .Result veya .Wait() çağırmak neden deadlock'a yol açabilir? ConfigureAwait(false) ne işe yarar?ZorC# & .NETBackend
  6. ASP.NET Core DI'da Transient, Scoped ve Singleton lifetime'ları arasındaki fark nedir? Captive dependency nedir?OrtaC# & .NETBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle