.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.
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.
dotnet new webapi -n MyWebApi
.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.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Hello, World!"); app.Run();
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.
[ApiController] [Route("[controller]")] public class MyController : ControllerBase { [HttpGet] public IActionResult Get() => Ok("Hello from MyController"); }
.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.
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()); }
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.
builder.Services.AddScoped<MyService>();
.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.
// appsettings.Development.json { "Logging": { "LogLevel": { "Default": "Debug" } } }
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.
app.Use(async (context, next) => { // Custom logic before passing to the next middleware await next(); // Custom logic after executing the next middleware });
.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.
[HttpGet("myaction/{id}")] public IActionResult GetAction(int id) => Ok($"Action with ID = {id}");
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.
public class MyModel { public int Id { get; set; } public string Name { get; set; } } [HttpPost] public IActionResult PostAction([FromBody] MyModel model) => Ok(model);
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.
public class MyModel { [Required] public int Id { get; set; } [StringLength(100)] public string Name { get; set; } }
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.
[HttpGet("{id}")] public async Task<IActionResult> GetAsync(int id) { var result = await _service.GetByIdAsync(id); return Ok(result); }
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.
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" }); }));
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.
builder.Services.AddApiVersioning(options => { options.AssumeDefaultVersionWhenUnspecified = true; options.DefaultApiVersion = new ApiVersion(1, 0); options.ReportApiVersions = true; });
İç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.
builder.Services.AddControllers() .AddXmlDataContractSerializerFormatters();
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.
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; options.JsonSerializerOptions.IgnoreNullValues = true; });
Ç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.
builder.Services.AddCors(options => { options.AddPolicy("AllowSpecificOrigin", builder => builder.WithOrigins("http://example.com")); }); app.UseCors("AllowSpecificOrigin");
İ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.
builder.Services.AddAuthentication("Bearer") .AddJwtBearer(options => { options.Authority = "https://your-auth-server"; options.Audience = "your-api"; });
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.
[Authorize] public class SecureController : ControllerBase { // Action methods here }
Swagger (OpenAPI), API'niz için etkileşimli belgeler sağlayarak geliştiricilerin onu kolayca anlamasına ve kullanmasına olanak tanır.
builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); app.UseSwagger(); app.UseSwaggerUI();
.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.
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 });
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.
public class MyDbContext : DbContext { public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) {} public DbSet<MyModel> MyModels { get; set; } }
Geçişler, veri modellerinizdeki değişiklikleri izleyerek veritabanı şemanıza sürüm kontrolü uygulamanıza olanak tanır.
dotnet ef migrations add InitialCreate dotnet ef database update
Depo modeli veri katmanını soyutlayarak uygulamanızı daha modüler ve bakımı daha kolay hale getirir.
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... }
Birim testi, ayrı ayrı kod birimlerini ayrı ayrı test ederek Web API'nizin doğru şekilde çalışmasını sağlar.
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); } }
.NET Web API, RESTful hizmetleri sağlayan bir ön uç uygulaması için arka uç görevi görebilir.
fetch('https://localhost:5001/mycontroller') .then(response => response.json()) .then(data => console.log(data));
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.
builder.Services.AddHealthChecks(); app.MapHealthChecks("/health");
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.
public class MyHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } }
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.
[HttpGet("{id}")] [ResponseCache(Duration = 60)] public IActionResult GetById(int id) { // Retrieve and return your resource }
Statik dosyaların (HTML, CSS, JavaScript vb.) sunulması, ön uç uygulamaların .NET Web API ile desteklenmesi için önemlidir.
app.UseStaticFiles(); // Enable static file serving
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.
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 }
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.
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>(); } }
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.
// 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" } }; });
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.
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); } }
Çı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.
[HttpGet] [ResponseCache(Duration = 120, Location = ResponseCacheLocation.Client, NoStore = false)] public IActionResult Get() { // Your logic here }
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.
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); } } }
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.
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(); } });
İ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.
var supportedCultures = new[] { "en-US", "fr-FR" }; var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); app.UseRequestLocalization(localizationOptions);
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.
// Assume using a library like HotChocolate builder.Services .AddGraphQLServer() .AddQueryType<Query>(); app.MapGraphQL();
İ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.
// Assume using Application Insights builder.Services.AddApplicationInsightsTelemetry("YOUR_INSTRUMENTATION_KEY");
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.
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"); }); }
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.
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; } }
Ö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.
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; } }
.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.
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"));
Bir uygulamanın izlenmesi ve profilinin çıkarılması, performansı optimize etmek için gerekli olan darboğazları ve verimsizlikleri belirleyebilir.
app.UseMiniProfiler();
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.
builder.Services.AddSwaggerGen(c => { var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); });
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.
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); app.UseRequestLocalization(app.Services.GetRequiredService<IOptions<RequestLocalizationOptions>>().Value);
Ç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.
app.UseHsts(); app.UseXContentTypeOptions(); app.UseReferrerPolicy(opts => opts.NoReferrer()); app.UseXXssProtection(options => options.EnabledWithBlockMode()); app.UseXfo(options => options.Deny());
Ö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.
// Using a library like Microsoft.FeatureManagement builder.Services.AddFeatureManagement();
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.
// In a Blazor Server app @code { private IEnumerable<WeatherForecast> forecasts; protected override async Task OnInitializedAsync() { forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast"); } }
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.
builder.Services.AddResponseCompression(options => { options.Providers.Add<GzipCompressionProvider>(); options.EnableForHttps = true; }); app.UseResponseCompression();
C# topluluğunun bir parçası olduğunuz için teşekkür ederiz! Sen ayrılmadan:
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ı