Middleware ve Request Pipeline

ASP.NET Core, gelen HTTP isteklerini işlemek ve yanıt üretmek için Middleware (Ara Katman Yazılımları) kullanan Request Pipeline (İstek İşleme Boru Hattı) prensibine dayanır. Bu yapı sayesinde, her istek belirli aşamalardan geçerek işlenir ve geliştirme sürecinde esneklik sağlar.

Bu bölümde:

  • Middleware nedir?
  • Request Pipeline nasıl çalışır?
  • Özel Middleware nasıl yazılır?
  • Request Pipeline nasıl yönetilir?
  • Uygulamalı örnekler

detaylı bir şekilde ele alınacaktır.

1. Middleware (Ara Katman Yazılımı) Nedir?

Middleware, ASP.NET Core’da gelen isteklerin (HTTP Request) işlenmesi sürecinde kullanılan bir bileşendir. İstekleri yönlendirme, doğrulama, hata yönetimi, oturum yönetimi, loglama gibi görevleri yerine getirir.

📌 Middleware’ler sıralı çalışır ve isteği bir sonraki middleware’e yönlendirebilir veya doğrudan yanıt üretebilir.

Örnek Middleware Kullanım Alanları:

  • Kimlik doğrulama (Authentication)
  • Yetkilendirme (Authorization)
  • Hata yönetimi (Exception Handling)
  • Loglama (Logging)
  • CORS (Cross-Origin Resource Sharing)
  • Önbellekleme (Caching)
  • Gzip gibi sıkıştırma işlemleri

2. Request Pipeline (İstek İşleme Boru Hattı) Nedir?

Request Pipeline, ASP.NET Core uygulamasına gelen HTTP isteklerinin geçtiği ve işlendiği middleware zinciridir.
İstek, Middleware katmanları aracılığıyla işlenir ve en sonunda bir yanıt üretilir.

İstek İşleme Adımları (Request Flow)

  1. Tarayıcıdan bir HTTP isteği gönderilir.
  2. İstek, Middleware katmanlarından sırayla geçer.
  3. Eğer bir Middleware isteği doğrudan yanıtlamazsa, bir sonraki Middleware’e iletir.
  4. Controller veya başka bir işlemci isteği işler ve yanıt üretir.
  5. Yanıt, Middleware zincirinden tekrar geçerek istemciye gönderilir.

3. Middleware Kullanımı ve Konfigürasyonu

ASP.NET Core uygulamalarında Middleware’ler genellikle Startup.cs veya Program.cs içinde yapılandırılır.

3.1. Program.cs Dosyasında Middleware Tanımlama

ASP.NET Core 6 ve sonrası için Middleware tanımlamaları Program.cs içinde yapılır.

Örnek:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.Use(async (context, next) =>
{
    Console.WriteLine("İlk Middleware çalışıyor...");
    await next.Invoke();  // Bir sonraki Middleware'e geç
    Console.WriteLine("İlk Middleware'den dönüş...");
});

app.Use(async (context, next) =>
{
    Console.WriteLine("İkinci Middleware çalışıyor...");
    await next.Invoke();
    Console.WriteLine("İkinci Middleware'den dönüş...");
});

app.Run(async (context) =>
{
    await context.Response.WriteAsync("Hello, Middleware!");
});

app.Run();
C#
C#
İlk Middleware çalışıyor...
İkinci Middleware çalışıyor...
İkinci Middleware'den dönüş...
İlk Middleware'den dönüş...
C#

Bu örnekte Middleware’ler sırayla çalışıyor ve işlemler tamamlandıktan sonra geri dönülüyor.

4. Özel Middleware Yazma

Kendi Middleware’inizi oluşturabilirsiniz. Bunun için bir Middleware sınıfı tanımlamanız gerekir.

4.1. Özel Middleware Tanımlama

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        Console.WriteLine("Özel Middleware çalışıyor...");
        await _next(context); // Sonraki Middleware'e geç
    }
}
C#

4.2. Middleware Kullanımı

Bu Middleware’i Program.cs içinde ekleyelim:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseMiddleware<CustomMiddleware>();

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello, Custom Middleware!");
});

app.Run();
C#

📌 Middleware sırasına göre istek işlenir ve isteğe göre yönlendirilir.

5. ASP.NET Core’da Hazır Middleware Bileşenleri

ASP.NET Core, sık kullanılan Middleware’leri barındırır.

MiddlewareAçıklama
UseRouting()Routing sistemini aktif eder.
UseAuthentication()Kimlik doğrulama Middleware’ini ekler.
UseAuthorization()Yetkilendirme Middleware’ini ekler.
UseCors()CORS politikalarını belirler.
UseExceptionHandler()Hata yönetimi Middleware’ini ekler.
UseStaticFiles()Statik dosyaların (CSS, JS) sunulmasını sağlar.

Örnek:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseRouting();
app.UseAuthorization();
app.UseStaticFiles();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

app.Run();
C#

📌 Bu yapı, API isteklerini doğru bir şekilde yönlendirmek için gereklidir.

6. Middleware Sırası ve Önemi

Middleware sırası önemlidir! Eğer yanlış sıralarsanız, uygulamanız düzgün çalışmayabilir.

Yanlış Kullanım Örneği

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

app.UseRouting();  // HATA! Routing öncesinde olması gerekir.

app.Run();
C#

📌 Bu kod çalışmaz çünkü önce Routing yapılmalı, sonra Controller’lar tanımlanmalıdır.

Doğru Sıralama

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

app.Run();
C#

📌 Önce Routing yapılır, sonra kimlik doğrulama ve yetkilendirme işlemleri çalıştırılır.

Middleware ve Request Pipeline kavramları, ASP.NET Core’un temel taşlarından biridir. Middleware kullanımı ile:

  • Kimlik doğrulama, hata yönetimi, loglama gibi işlemler merkezi bir şekilde yapılabilir.
  • İstekler sıralı olarak işlenebilir ve özelleştirilebilir.
  • Performans artırılabilir ve güvenlik önlemleri alınabilir.