Skip to content

Routing

Genel Bakış

Routing, ASP.NET Core uygulamalarında gelen HTTP isteklerini ilgili controller action'larına yönlendiren mekanizmadır. İki temel routing yaklaşımı vardır: convention-based routing ve attribute routing.

Mülakat Soruları ve Cevapları

1. Routing nedir ve nasıl çalışır?

Cevap: Routing, URL'leri controller action'larına eşleştiren bir mekanizmadır. Çalışma prensibi: - URL'yi parse eder - Route template'leri kontrol eder - Route değerlerini çıkarır - Controller ve action'ı belirler

Örnek Kod:

// Convention-based routing
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

// Attribute routing
[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet("{id}")]
    public IActionResult GetProduct(int id)
    {
        // ...
    }
}

2. Convention-based routing ve attribute routing arasındaki farklar nelerdir?

Cevap: Convention-based routing: - Startup.cs'te tanımlanır - Global route kuralları - Daha az esnek - Legacy uygulamalar için uygun

Attribute routing: - Controller/action seviyesinde tanımlanır - Daha esnek ve okunabilir - RESTful API'ler için ideal - Modern yaklaşım

Örnek Kod:

// Convention-based
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "blog",
        pattern: "blog/{*article}",
        defaults: new { controller = "Blog", action = "Article" });
});

// Attribute
[Route("api/[controller]")]
public class BlogController : Controller
{
    [HttpGet("{article}")]
    public IActionResult Article(string article)
    {
        // ...
    }
}

3. Route constraints nedir ve nasıl kullanılır?

Cevap: Route constraints, route parametrelerine kısıtlama getirmek için kullanılır: - Veri tipi kontrolü - Regex pattern kontrolü - Min/max değer kontrolü - Custom constraint'ler

Örnek Kod:

// Convention-based constraints
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id:int}");
});

// Attribute constraints
[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet("{id:int:min(1)}")]
    public IActionResult GetProduct(int id)
    {
        // ...
    }

    [HttpGet("{name:alpha}")]
    public IActionResult GetProductByName(string name)
    {
        // ...
    }
}

4. Route parameters nasıl kullanılır?

Cevap: Route parametreleri şu şekilde kullanılabilir: - Query string parametreleri - Route segment parametreleri - Optional parametreler - Default değerler

Örnek Kod:

[Route("api/[controller]")]
public class ProductsController : Controller
{
    // Query string: /api/products?category=electronics
    [HttpGet]
    public IActionResult GetByCategory(string category)
    {
        // ...
    }

    // Route parameter: /api/products/1
    [HttpGet("{id}")]
    public IActionResult GetById(int id)
    {
        // ...
    }

    // Optional parameter: /api/products/search/electronics
    [HttpGet("search/{category?}")]
    public IActionResult Search(string category = "all")
    {
        // ...
    }
}

5. Custom route handler nasıl oluşturulur?

Cevap: Custom route handler oluşturmak için: - IRouteConstraint interface'i implemente edilir - Match metodu override edilir - Startup.cs'te kaydedilir - Route'larda kullanılır

Örnek Kod:

public class CustomRouteConstraint : IRouteConstraint
{
    public bool Match(
        HttpContext httpContext,
        IRouter route,
        string routeKey,
        RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        // Custom logic
        return true;
    }
}

// Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<RouteOptions>(options =>
    {
        options.ConstraintMap.Add("custom", typeof(CustomRouteConstraint));
    });
}

// Usage
[Route("api/[controller]")]
public class ProductsController : Controller
{
    [HttpGet("{id:custom}")]
    public IActionResult GetProduct(string id)
    {
        // ...
    }
}

Best Practices

  1. Route Tasarımı
  2. RESTful prensipleri takip edin
  3. Anlamlı URL'ler kullanın
  4. Versioning için prefix kullanın
  5. Route'ları modüler tutun

  6. Performans

  7. Route sayısını minimize edin
  8. Complex constraint'lerden kaçının
  9. Route cache'ini kullanın
  10. Route order'ı optimize edin

  11. Güvenlik

  12. Route injection'dan kaçının
  13. Sensitive data'ları route'ta kullanmayın
  14. Authorization kontrolü yapın
  15. Rate limiting uygulayın

Kaynaklar