.NET CLI kullanarak ilk proje kurulumundan ara yazılımları, denetleyicileri ve hizmetleri yapılandırmaya kadar sağlam bir API oluşturmaya yönelik her adımı öğrenin. Ölçeklenebilir, verimli web uygulamaları oluşturmak için bağımlılık ekleme, eşzamansız eylemler ve istisnaları işlemeye yönelik en iyi uygulamaları keşfedin.
1. .NET 8 Web API Projesi Kurma
Konsept
Yeni bir Web API projesi oluşturmak için .NET CLI'yi kullanın. Bu, başlatma için Program.cs'yi ve örnek olarak bir WeatherForecast denetleyicisini içeren temel bir proje yapısı oluşturur.
Kod Örneği
dotnet new webapi -n MyWebApi
2. Program.cs — Minimum API Yapılandırması
Konsept
.NET 8, hizmetleri ve uç noktaları doğrudan Program.cs dosyasında basitleştirilmiş ve kısa bir şekilde yapılandırmanıza olanak tanıyarak minimal API'lere yönelik eğilimi sürdürüyor.
Kod Örneği
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Hello, World!"); app.Run();
3. Denetleyicinin Tanımlanması
Konsept
Denetleyiciler gelen HTTP isteklerini yönetir ve istemciye yanıt verir. ControllerBase'den miras alınarak ve [ApiController] ile açıklama eklenerek tanımlanırlar.
Kod Örneği
[ApiController] [Route("[controller]")] public class MyController : ControllerBase { [HttpGet] public IActionResult Get() => Ok("Hello from MyController"); }
4. Denetleyicilere Bağımlılık Enjeksiyonu
Konsept
.NET Core'un yerleşik bağımlılık eklemesi (DI), bağımlılıkları yönetmeyi kolaylaştırır. Hizmetleri denetleyicilerinize yapıcıları aracılığıyla enjekte edebilirsiniz.
Kod Örneği
public class MyService { public string GetMessage() => "Injected message"; } public class MyController : ControllerBase { private readonly MyService _myService; public MyController(MyService myService) { _myService = myService; } [HttpGet] public IActionResult Get() => Ok(_myService.GetMessage()); }
5. Hizmetleri Yapılandırma
Konsept
Hizmetler (veritabanı bağlamları, özel hizmetler vb. gibi) Program.cs dosyasında yapılandırılarak uygulamanızın tamamında bağımlılık ekleme için kullanılabilir hale getirilir.
Kod Örneği
builder.Services.AddScoped<MyService>();
6. Ortama Dayalı Yapılandırma
Konsept
.NET, uygulamanın ortamına bağlı olarak farklı ayarlara izin vererek ortama özgü yapılandırma dosyalarını (appsettings.json, appsettings.Development.json vb.) destekler.
Kod Örneği
// appsettings.Development.json { "Logging": { "LogLevel": { "Default": "Debug" } } }
7. Ara yazılım
Konsept
Ara yazılım bileşenleri, istekleri ve yanıtları işleyen bir işlem hattı oluşturur. Günlüğe kaydetme veya hata işleme gibi kesişen konular için özel ara yazılım oluşturulabilir.
Kod Örneği
app.Use(async (context, next) => { // Custom logic before passing to the next middleware await next(); // Custom logic after executing the next middleware });
8. Yönlendirme
Konsept
.NET Web API'sinde yönlendirme, denetleyiciler ve eylem yöntemleri üzerindeki öznitelik yönlendirme yoluyla gerçekleştirilir. Bu, URL'lerin doğrudan denetleyici eylemleriyle eşleştirilmesine olanak tanır.
Kod Örneği
[HttpGet("myaction/{id}")] public IActionResult GetAction(int id) => Ok($"Action with ID = {id}");
9. Model Bağlama
Konsept
Model bağlama, HTTP isteklerinden gelen verileri eylem yöntemi parametrelerine otomatik olarak eşler. JSON gövdeleri ve sorgu dizesi parametreleri dahil olmak üzere karmaşık türleri destekler.
Kod Örneği
public class MyModel { public int Id { get; set; } public string Name { get; set; } } [HttpPost] public IActionResult PostAction([FromBody] MyModel model) => Ok(model);
10. Veri Doğrulaması
Konsept
Model verilerini doğrulamak için veri açıklamaları kullanılabilir. [ApiController] özelliği doğrulamayı otomatik olarak zorlar ve model geçersizse 400 ile yanıt verir.
Kod Örneği
public class MyModel { [Required] public int Id { get; set; } [StringLength(100)] public string Name { get; set; } }
11. Eşzamansız Eylemler
Konsept
Eşzamansız eylemler, G/Ç işlemlerinin tamamlanmasını beklerken iş parçacıklarını serbest bırakarak ölçeklenebilirliği artırır. Async anahtar sözcüğünü kullanın ve Görev veya Görev<IActionResult> değerini döndürün.
Kod Örneği
[HttpGet("{id}")] public async Task<IActionResult> GetAsync(int id) { var result = await _service.GetByIdAsync(id); return Ok(result); }
12. İstisnaları Küresel Olarak Ele Alma
Konsept
Genel istisna işleme, merkezi hata işlemeye, günlüğe kaydetmeye ve işlenmeyen istisnalar üzerinde standartlaştırılmış API yanıtlarına olanak tanır.
Kod Örneği
app.UseExceptionHandler(a => a.Run(async context => { var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>(); var exception = exceptionHandlerPathFeature.Error; // Log the exception, generate a custom response, etc. context.Response.StatusCode = 500; await context.Response.WriteAsJsonAsync(new { Error = "An unexpected error occurred" }); }));
13. API Sürümü Oluşturma
Konsept
API sürüm oluşturma, zaman içinde API'de yapılan değişikliklerin yönetilmesine yardımcı olur. .NET platformu, sorgu dizesi, URL yolu veya istek başlığı aracılığıyla sürüm oluşturmayı destekler.
Kod Örneği
builder.Services.AddApiVersioning(options => { options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); options.ReportApiVersions = true; });
14. İçerik Müzakereleri
Konsept
İçerik anlaşması, bir API'nin istekteki Accept başlığına göre farklı yanıt formatları sunmasına olanak tanır ve JSON, XML vb. formatlar için destek sağlar.
Kod Örneği
builder.Services.AddControllers() .AddXmlDataContractSerializerFormatters();
15. Özel JSON Serileştirme Ayarları
Konsept
JSON seri hale getirici ayarlarını yapılandırarak, camelCase adlandırma veya boş değerleri yok sayma gibi JSON yanıt biçimlendirmesini özelleştirin.
Kod Örneği
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.IgnoreNullValues = true; });
16. CORS'u Yapılandırma
Konsept
Çapraz Kaynaklı Kaynak Paylaşımı (CORS), API'nizin farklı alanlarda barındırılan web uygulamalarından çağrılmasına olanak tanır. CORS ilkesini gereksinimlerinize göre yapılandırın.
Kod Örneği
builder.Services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", builder => builder.WithOrigins("http://example.com")); }); app.UseCors("AllowSpecificOrigin");
17. Kimlik Doğrulama
Konsept
İstekte bulunan kullanıcıların veya hizmetlerin kimliğini doğrulayan kimlik doğrulamayı etkinleştirerek API'nizi güvence altına alın.
Kod Örneği
builder.Services.AddAuthentication("Bearer") .AddJwtBearer(options => { options.Authority = "https://your-auth-server"; options.Audience = "your-api"; });
18. Yetkilendirme
Konsept
Kimlik doğrulamanın ardından yetkilendirme, kimliği doğrulanmış bir kullanıcının bir eylemi gerçekleştirme veya bir kaynağa erişme iznine sahip olup olmadığını belirler.
Kod Örneği
[Authorize] public class SecureController : ControllerBase { // Action methods here }
19. Swagger/OpenAPI Entegrasyonu
Konsept
Swagger (OpenAPI), API'niz için etkileşimli belgeler sağlayarak geliştiricilerin onu kolayca anlamasına ve kullanmasına olanak tanır.
Kod Örneği
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); app.UseSwagger(); app.UseSwaggerUI();
20. Günlüğe kaydetme
Konsept
.NET Core, mesajları çeşitli çıkışlara (konsol, hata ayıklama penceresi, harici hizmetler vb.) günlüğe kaydedebilen yerleşik bir günlük kaydı çerçevesi sağlar.
Kod Örneği
logger.LogInformation("This is an informational message"); app.Use(async (context, next) => { logger.LogError("This is an error message before the next middleware"); await next.Invoke(); // Log after calling the next middleware });
21. Entity Framework Core'u Kullanma
Konsept
Entity Framework Core, .NET uygulamalarında veri erişimi için kullanılan bir ORM'dir. Güçlü yazılan nesneleri kullanarak verileri sorgulamanıza ve değiştirmenize olanak tanır.
Kod Örneği
public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) {} public DbSet<MyModel> MyModels { get; set; } }
22. Varlık Çerçevesi Çekirdeğindeki Geçişler
Konsept
Geçişler, veri modellerinizdeki değişiklikleri izleyerek veritabanı şemanıza sürüm kontrolü uygulamanıza olanak tanır.
Kod Örneği
dotnet ef migrations add InitialCreate dotnet ef database update
23. Depo Modeli
Konsept
Depo modeli veri katmanını soyutlayarak uygulamanızı daha modüler ve bakımı daha kolay hale getirir.
Kod Örneği
public interface IRepository<T> { Task<IEnumerable<T>> GetAllAsync(); Task<T> GetByIdAsync(int id); // Other methods... } public class MyRepository<T> : IRepository<T> where T : class { private readonly MyDbContext _context; public MyRepository(MyDbContext context) { _context = context; } // Implement methods... }
24. Birim Testi
Konsept
Birim testi, ayrı ayrı kod birimlerini ayrı ayrı test ederek Web API'nizin doğru şekilde çalışmasını sağlar.
Kod Örneği
public class MyControllerTests { [Fact] public async Task Get_ReturnsExpectedValue() { // Arrange var serviceMock = new Mock<IMyService>(); serviceMock.Setup(service => service.GetAsync()).ReturnsAsync("test"); var controller = new MyController(serviceMock.Object); // Act var result = await controller.Get(); // Assert Assert.Equal("test", result.Value); } }
25. Ön Uçla Entegrasyon
Konsept
.NET Web API, RESTful hizmetleri sağlayan bir ön uç uygulaması için arka uç görevi görebilir.
Kod Örneği
fetch('https://localhost:5001/mycontroller') .then(response => response.json()) .then(data => console.log(data));
26. Sağlık Kontrolleri
Konsept
Durum denetimleri, uygulamanızın durumunu ve bağımlılıklarını izlemenin bir yolunu sağlar; mikro hizmet mimarileri için faydalıdır.
Kod Örneği
builder.Services.AddHealthChecks(); app.MapHealthChecks("/health");
27. Gerçek Zamanlı İletişim için SignalR'ı Kullanmak
Konsept
SignalR, sunucu tarafı kodunun istemci tarafı web uygulamalarına eşzamansız bildirimler göndermesine olanak tanıyarak gerçek zamanlı web işlevselliğini sağlar.
Kod Örneği
public class MyHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } }
28. Yanıt Önbelleğe Alma İşlemini Yapılandırma
Konsept
Yanıt önbelleğe alma, daha önce istenen kaynakların bir kopyasını depolayarak bir sunucunun işlemesi gereken isteklerin sayısını azaltır.
Kod Örneği
[HttpGet("{id}")] [ResponseCache(Duration = 60)] public IActionResult GetById(int id) { // Retrieve and return your resource }
29. Statik Dosyalar
Konsept
Statik dosyaların (HTML, CSS, JavaScript vb.) sunulması, ön uç uygulamaların .NET Web API ile desteklenmesi için önemlidir.
Kod Örneği
app.UseStaticFiles(); // Enable static file serving
30. Gelişmiş Yapılandırma ve Seçenekler Modeli
Konsept
Seçenekler modeli, ilgili ayar gruplarını temsil etmek için sınıfları kullanır. IOptions<T>'yi kullanarak bu ayarlara uygulamanızın herhangi bir yerinden erişebilirsiniz.
Kod Örneği
public class MySettings { public string Setting1 { get; set; } // Other settings } builder.Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings")); public class MyService { private readonly MySettings _settings; public MyService(IOptions<MySettings> settings) { _settings = settings.Value; } // Use _settings.Setting1 }
31. Özel Ara Yazılım
Konsept
Ara yazılım, istekleri ve yanıtları işlemek için bir uygulama hattında bir araya getirilen yazılımdır. Belirli görevleri gerçekleştirmek için özel ara katman yazılımı oluşturulabilir.
Kod Örneği
public class MyCustomMiddleware { private readonly RequestDelegate _next; public MyCustomMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext httpContext) { // Pre-processing logic here await _next(httpContext); // Call the next middleware in the pipeline // Post-processing logic here } } // Extension method for easy middleware registration public static class MyCustomMiddlewareExtensions { public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder builder) { return builder.UseMiddleware<MyCustomMiddleware>(); } }
32. Hız Sınırlaması
Konsept
Hız sınırlama, bir kullanıcının belirli bir zaman dilimi içinde ne sıklıkta istekte bulunabileceğini sınırlayarak API'nizi aşırı kullanıma karşı korur.
Kod Örneği
// Assume using a third-party library like AspNetCoreRateLimit builder.Services.AddInMemoryRateLimiting(); builder.Services.Configure<IpRateLimitOptions>(options => { options.GeneralRules = new List<RateLimitRule> { new RateLimitRule { Endpoint = "*", Limit = 100, Period = "1h" } }; });
33. API Anahtarları Kimlik Doğrulaması
Konsept
API anahtarları, API çağrılarının kimliğini doğrulamanın ve yetkilendirmenin basit bir yoludur. İstemciden sunucuya sorgu dizesinde veya başlıkta aktarılırlar.
Kod Örneği
public class ApiKeyMiddleware { private readonly RequestDelegate _next; private const string APIKEYNAME = "x-api-key"; public ApiKeyMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { if (!context.Request.Headers.TryGetValue(APIKEYNAME, out var extractedApiKey)) { context.Response.StatusCode = 401; await context.Response.WriteAsync("API Key was not provided."); return; } // Validate the extracted API Key here... await _next(context); } }
34. Çıktı Önbelleğe Alma
Konsept
Çıktı önbelleğe alma, bir isteğe verilen yanıtı saklamanıza olanak tanır. Sonraki istekler önbellekten sunulabilir ve bu da performansı önemli ölçüde artırır.
Kod Örneği
[HttpGet] [ResponseCache(Duration = 120, Location = ResponseCacheLocation.Client, NoStore = false)] public IActionResult Get() { // Your logic here }
35. Arka Plan Görevleri
Konsept
Arka plan görevleri, e-posta gönderme veya uzun süren işleri işleme gibi işlemlerin kullanıcı isteklerinden bağımsız olarak arka planda yürütülmesine olanak tanır.
Kod Örneği
public class MyBackgroundService : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { // Your background task logic here await Task.Delay(TimeSpan.FromHours(1), stoppingToken); } } }
36. WebSoketleri
Konsept
WebSockets, gerçek zamanlı uygulamalar için ideal olan tek, uzun ömürlü bir bağlantı üzerinden tam çift yönlü bir iletişim kanalı sağlar.
Kod Örneği
app.UseWebSockets(); app.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); // Handle the WebSocket request here } else { await next(); } });
37. Yerelleştirme Talep Edin
Konsept
İstek yerelleştirmesi, isteğin bilgilerine dayalı olarak içeriği farklı kültürler ve diller için yerelleştirmenin bir yolunu sağlar.
Kod Örneği
var supportedCultures = new[] { "en-US", "fr-FR" }; var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); app.UseRequestLocalization(localizationOptions);
38. GraphQL ile entegrasyon
Konsept
GraphQL, API'ler için bir sorgulama dilidir. Bir .NET Web API'sinin GraphQL ile entegre edilmesi, daha verimli veri alımına olanak tanır.
Kod Örneği
// Assume using a library like HotChocolate builder.Services .AddGraphQLServer() .AddQueryType<Query>(); app.MapGraphQL();
39. İzleme ve Telemetri
Konsept
İzleme ve telemetri, uygulamanızın performansı ve kullanımına ilişkin verilerin toplanmasını, analiz edilmesini ve bunlara göre hareket edilmesini içerir.
Kod Örneği
// Assume using Application Insights builder.Services.AddApplicationInsightsTelemetry("YOUR_INSTRUMENTATION_KEY");
40. SignalR Hub'ları ve Gerçek Zamanlı İletişim
Konsept
SignalR, uygulamalara gerçek zamanlı web işlevselliği eklemeyi kolaylaştıran bir kitaplıktır. Gerçek zamanlı web işlevselliği, sunucunun bir istemcinin yeni veri istemesini beklemesini gerektirmeden, sunucu kodunun içeriği bağlı istemcilere anında iletebilmesi yeteneğidir. SignalR, sohbet uygulamaları, gerçek zamanlı kontrol panelleri ve daha etkileşimli web uygulamaları geliştirmek için mükemmeldir.
Kod Örneği
public class ChatHub : Hub { public async Task SendMessage(string user, string message) { // Call the broadcastMessage method to update clients. await Clients.All.SendAsync("broadcastMessage", user, message); } } // Startup or Program.cs app.MapHub<ChatHub>("/chathub");
Program.cs'ye entegrasyon:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // Other configurations... app.UseEndpoints(endpoints => { endpoints.MapHub<ChatHub>("/chathub"); }); }
41. Gelişmiş Varlık Çerçevesi Çekirdeği - İlişkiler
Konsept
Entity Framework Core, varlıklar arasındaki bire bir, bire çok ve çoktan çoğa gibi karmaşık ilişkilerin eşlenmesine olanak tanır.
Kod Örneği
public class Author { public int AuthorId { get; set; } public string Name { get; set; } public ICollection<Book> Books { get; set; } } public class Book { public int BookId { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } }
42. Özel Doğrulama Nitelikleri
Konsept
Özel doğrulama nitelikleri, yerleşik doğrulama niteliklerini genişleterek veri modelleri için doğrulama mantığınızı tanımlamanıza olanak tanır.
Kod Örneği
public class MyCustomValidationAttribute : ValidationAttribute { protected override ValidationResult IsValid(object value, ValidationContext validationContext) { // Your custom validation logic here if (value is int intValue && intValue > 0) { return ValidationResult.Success; } return new ValidationResult("Value must be positive"); } } public class MyModel { [MyCustomValidationAttribute] public int MyProperty { get; set; } }
43. Gelişmiş Yapılandırma Senaryoları
Konsept
.NET'in seçenekler modeli, iç içe geçmiş nesneler, listeler ve doğrulama dahil olmak üzere karmaşık yapılandırma senaryolarını destekler.
Kod Örneği
public class MyOptions { public MyNestedOptions Nested { get; set; } public List<string> Items { get; set; } } public class MyNestedOptions { public string Key { get; set; } } // In Program.cs or Startup.cs builder.Services.Configure<MyOptions>(builder.Configuration.GetSection("MyOptions"));
44. Performans İzleme ve Profil Oluşturma
Konsept
Bir uygulamanın izlenmesi ve profilinin çıkarılması, performansı optimize etmek için gerekli olan darboğazları ve verimsizlikleri belirleyebilir.
Kod Örneği
app.UseMiniProfiler();
45. Swagger ve XML Yorumlarıyla API Dokümantasyonu
Konsept
XML yorumlarını Swagger kullanıcı arayüzünüze entegre ederek API belgelerinizi geliştirin ve API'nizi kullanan geliştiricilere daha zengin bir deneyim sağlayın.
Kod Örneği
builder.Services.AddSwaggerGen(c => { var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); });
46. Küreselleşme ve Yerelleştirme
Konsept
Küreselleştirme ve yerelleştirme, uygulamanızın birden çok dili ve kültürü desteklemesine olanak tanıyarak onu küresel bir hedef kitle için erişilebilir hale getirir.
Kod Örneği
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
47. Güvenlik Başlıkları
Konsept
Çeşitli HTTP üstbilgileri ekleyerek web uygulamanızın güvenliğini artırmak, yaygın saldırılara ve güvenlik açıklarına karşı koruma sağlayabilir.
Kod Örneği
app.UseHsts(); app.UseXContentTypeOptions(); app.UseReferrerPolicy(opts => opts.NoReferrer()); app.UseXXssProtection(options => options.EnabledWithBlockMode()); app.UseXfo(options => options.Deny());
48. Özellik Bayrakları
Konsept
Özellik bayrakları, yeni kod dağıtmadan uygulamanızın özelliklerini açıp kapatmanıza olanak tanıyarak test etme ve kullanıma sunma işlemlerini kolaylaştırır.
Kod Örneği
// Using a library like Microsoft.FeatureManagement builder.Services.AddFeatureManagement();
49. Blazor Entegrasyonu
Konsept
Blazor, JavaScript yerine C# kullanarak etkileşimli web kullanıcı arayüzleri oluşturmanıza olanak tanır. Blazor'un Web API ile entegre edilmesi kusursuz bir tam yığın geliştirme deneyimi sağlar.
Kod Örneği
// In a Blazor Server app @code { private IEnumerable<WeatherForecast> forecasts; protected override async Task OnInitializedAsync() { forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast"); } }
50. Yanıt Sıkıştırma için Gelişmiş Ara Yazılım
Konsept
Yanıt sıkıştırma, API yanıtlarınızın boyutunu azaltarak yavaş ağlar üzerindeki istemciler için yükleme sürelerini iyileştirebilir.
Kod Örneği
builder.Services.AddResponseCompression(options => { options.Providers.Add<GzipCompressionProvider>(); options.EnableForHttps = true; }); app.UseResponseCompression();
C# Programlama🚀
C# topluluğunun bir parçası olduğunuz için teşekkür ederiz! Sen ayrılmadan:
Buraya kadar geldiyseniz lütfen takdirinizi alkışlayarak gösterin ve yazarı takip edin! 👏️️
Bizi takip edin: X | LinkedIn | Geliştirme | Hashnode | Bülten | Tumblr
Diğer platformlarımızı ziyaret edin: GitHub | instagram | Tiktok | Quora | Daily.dev
Burada da yayınlandı