ASP.NET Core, C# dilinde modern ve yüksek performanslı web API’leri geliştirmek için kullanılan güçlü bir çatıydıır. Bu makalede, ASP.NET Core Web API geliştirme süreci detaylı olarak ele alınacak, temel kavramlardan ileri düzey konulara kadar bilgiler sunulacaktır.

ASP.NET Core Web API Nedir?

ASP.NET Core Web API, RESTful servisler oluşturmak için kullanılan açık kaynaklı bir frameworktür. Özellikle mikroservis mimarileri ve mobil uygulamalar için backend sağlama konusunda oldukça yaygındır. API, HTTP isteklerine yanıt veren ve JSON gibi formatlarda veri döndüren servislerdir. ASP.NET Core, .NET 6 ve sonrası sürümlerde minimal API gibi yeniliklerle daha sade ve hızlı bir geliştirme deneyimi sunar.

Temel Gereksinimler ve Kurulum

ASP.NET Core Web API geliştirmeye başlamak için öncelikle sisteminizde .NET SDK yüklü olması gerekir. En güncel sürümü resmi .NET sitesinden indirip kurabilirsiniz. Ayrıca Visual Studio, Visual Studio Code veya JetBrains Rider gibi bir IDE tercih edebilirsiniz. Geliştirme ortamı hazır olduktan sonra aşağıdaki komutla yeni bir Web API projesi oluşturabilirsiniz:

dotnet new webapi -n MyWebAPI

Bu komut, “MyWebAPI” adında yeni bir ASP.NET Core Web API projesi oluşturur. Projeyi çalıştırmak için şu komutları kullanabilirsiniz:

cd MyWebAPI
dotnet run

Controller Tabanlı API Geliştirme

Geleneksel ASP.NET Core Web API geliştirme yaklaşımında, API’ler controller sınıfları aracılığıyla tanımlanır. ControllerBase sınıfından türeyen bir sınıf, API endpoint’lerini tanımlamak için kullanılır. Aşağıda basit bir ProductsController örneği verilmiştir:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private static List<Product> products = new()
    {
        new Product { Id = 1, Name = "Laptop", Price = 15000 },
        new Product { Id = 2, Name = "Mouse", Price = 200 }
    };

    [HttpGet]
    public IActionResult Get()
    {
        return Ok(products);
    }

    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        var product = products.FirstOrDefault(p => p.Id == id);
        if (product == null)
            return NotFound();

        return Ok(product);
    }

    [HttpPost]
    public IActionResult Post(Product product)
    {
        product.Id = products.Max(p => p.Id) + 1;
        products.Add(product);
        return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
    }
}

Bu controller, GET, POST gibi temel HTTP metodlarını kullanarak ürün listesi yönetimi sağlar. Her metodun üzerine attribute ile route ve HTTP verb bilgisi eklenmiştir.

Minimal API Yaklaşımı

.NET 6 ile birlikte tanıtılan minimal API yaklaşımı, daha az boilerplate kodla hızlıca API endpointleri oluşturmayı sağlar. Bu yaklaşım, özellikle mikroservisler ve prototipleme için uygundur. Basit bir örnek aşağıdaki gibidir:

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

var products = new List<Product>
{
    new Product { Id = 1, Name = "Laptop", Price = 15000 },
    new Product { Id = 2, Name = "Mouse", Price = 200 }
};

app.MapGet("/api/products", () => products);
app.MapGet("/api/products/{id}", (int id) =>
{
    var product = products.FirstOrDefault(p => p.Id == id);
    return product is not null ? Results.Ok(product) : Results.NotFound();
});

app.Run();

Bu örnekte, app.MapGet ile GET istekleri için endpointler tanımlanmıştır. Minimal API’lerde dependency injection, middleware kullanımı ve route tanımlama işlemleri daha sade bir şekilde yapılmaktadır.

Model Doğrulama ve Hata Yönetimi

API’lerde gelen verilerin doğrulanması büyük önem taşır. ASP.NET Core, model binding ve data annotation’lar aracılığıyla veri doğrulama yapısını sağlar. Örneğin:

public class Product
{
    public int Id { get; set; }

    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    [Range(0, double.MaxValue)]
    public decimal Price { get; set; }
}

Controller içinde ModelState.IsValid ile doğrulama yapılabilir:

[HttpPost]
public IActionResult Post(Product product)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    product.Id = products.Max(p => p.Id) + 1;
    products.Add(product);
    return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
}

Minimal API’lerde ise doğrulama için özel middleware veya sonuç filtreleri yazmak gerekebilir. Ancak daha esnek ve performanslı çözümler de sunulabilir.

Dependency Injection ve Servis Yönetimi

ASP.NET Core, yerleşik dependency injection container’ı ile servis yönetimini kolaylaştırır. Örneğin bir veri servisini uygulamaya şu şekilde ekleyebilirsiniz:

builder.Services.AddScoped<IProductService, ProductService>();

Bu yapı sayesinde controller ya da minimal API endpointleri içerisinde servisleri kullanabilirsiniz. Örneğin:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductsController(IProductService productService)
    {
        _productService = productService;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _productService.GetAllAsync();
        return Ok(products);
    }
}

Middleware Kullanımı ve Güvenlik

Middleware’ler, HTTP pipeline’ında istekleri işleyen bileşenlerdir. ASP.NET Core’da custom middleware yazılabilir veya hazır middleware’ler kullanılabilir. Örneğin, bir isteğin işlenmeden önce loglanmasını sağlamak için:

app.Use(async (context, next) =>
{
    Console.WriteLine($"Request: {context.Request.Method} {context.Request.Path}");
    await next();
});

Güvenlik açısından JWT tabanlı kimlik doğrulama, CORS politikaları ve HTTPS redirection gibi yapılandırmalar da middleware ile yapılır:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = "your-issuer",
            ValidAudience = "your-audience",
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-secret-key"))
        };
    });

Veritabanı Entegrasyonu

Entity Framework Core, ASP.NET Core ile uyumlu bir ORM (Object-Relational Mapping) aracıdır. EF Core kullanarak veritabanı işlemleri kolayca yapılabilir. İlk olarak, bir DbContext sınıfı tanımlayın:

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    public DbSet<Product> Products { get; set; }
}

Startup’ta servis olarak ekleyin:

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer("connection-string"));

Controller içerisinde şu şekilde kullanabilirsiniz:

[HttpGet]
public async Task<IActionResult> Get()
{
    var products = await _context.Products.ToListAsync();
    return Ok(products);
}

API Versiyonlama ve Dokümantasyon

API’ler büyüdükçe versiyonlama gereklidir. Microsoft.AspNetCore.Mvc.Versioning paketi ile kolayca versiyonlama yapılabilir:

builder.Services.AddApiVersioning(options =>
{
    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new ApiVersion(1, 0);
    options.ReportApiVersions = true;
});

Swagger (OpenAPI) ile API dokümantasyonu sağlanabilir. Swashbuckle.AspNetCore paketi ile API’leriniz otomatik olarak dokümante edilir ve test edilebilir bir arayüz sunulur:

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

Sonuç: ASP.NET Core Web API, C# dilinde güçlü, hızlı ve esnek RESTful servisler geliştirmek için ideal bir platformdur. Controller tabanlı yapılar ve minimal API yaklaşımı ile farklı ihtiyaçlara uygun çözümler üretilebilir. Veritabanı entegrasyonu, güvenlik, versiyonlama ve dokümantasyon gibi konularla birlikte, bu çatı kurumsal projelerde de yaygın şekilde kullanılmaktadır.

Bir önceki yazımız olan Print Screen Engelleme başlıklı makalemizde Engelleme, İşletim Sistemi ve key logger hakkında bilgiler verilmektedir.