C# İle Web Tabanlı Bildirim Servisi Entegrasyonu Nasıl Yapılır?

C# İle Web Tabanlı Bildirim Servisi Entegrasyonu Nasıl Yapılır?
C# İle Web Tabanlı Bildirim Servisi Entegrasyonu Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarına göre aşağıdaki araçların kurulu olması gerekmektedir:

  • .NET 9.0 SDK veya üzeri.
  • Visual Studio 2022 (v17.12+) veya VS Code (C# Dev Kit ile).
  • Temel düzeyde JavaScript bilgisi (İstemci tarafındaki olayları dinlemek için).

Projenizi oluşturmak için terminal ekranında şu komutu kullanarak bir ASP.NET Core Web App (MVC veya API) başlatabilirsiniz:

dotnet new web -n BildirimServisiProjesi
cd BildirimServisiProjesi
dotnet add package Microsoft.AspNetCore.SignalR

SignalR, web soketleri (WebSockets) üzerinden tam çift yönlü (full-duplex) iletişim sağlayan bir kütüphanedir. Bu kütüphane, sunucunun istemciye "push" bildirim göndermesini sağlayan temel mekanizmadır.

SignalR Hub Yapılandırması

Bildirim servisi entegrasyonunda ilk adım, sunucu tarafında bir "Hub" sınıfı oluşturmaktır. Hub, istemcilerin bağlandığı ve sunucunun istemcilere mesaj gönderdiği merkezi noktadır.

using Microsoft.AspNetCore.SignalR;

public class NotificationHub : Hub
{
    public async Task SendNotification(string message)
    {
        // Tüm bağlı istemcilere bildirim gönder
        await Clients.All.SendAsync("ReceiveNotification", message);
    }
}

Bu sınıf, istemcilerden gelen çağrıları yönetir. Clients.All ifadesi, o an sisteme bağlı olan tüm tarayıcılara mesajın iletileceğini belirtir.

Program.cs Dosyasında Servis Kaydı

Oluşturduğunuz Hub'ın uygulama tarafından tanınması için Program.cs dosyasında gerekli servis kayıtlarını yapmalısınız. Bu adım, uygulamanın SignalR uç noktalarını (endpoints) dinlemesini sağlar.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();

var app = builder.Build();

app.MapHub("/notificationHub");
app.Run();

Burada /notificationHub yolu, istemcilerin bağlantı kuracağı URL adresidir. Bu yolun benzersiz ve uygulamanızdaki diğer rotalarla çakışmadığından emin olun.

İstemci Tarafında Bağlantı Kurma

Bildirimleri tarayıcıda göstermek için SignalR'ın JavaScript istemci kütüphanesini kullanırız. Aşağıdaki kod bloğu, sunucuya bağlanır ve gönderilen mesajları dinler.

// signalr kütüphanesinin yüklü olduğunu varsayıyoruz
const connection = new signalR.HubConnectionBuilder()
    .withUrl("/notificationHub")
    .build();

connection.on("ReceiveNotification", (message) => {
    console.log("Yeni Bildirim: " + message);
    alert(message); // Basit bir tarayıcı uyarısı
});

connection.start().catch(err => console.error(err.toString()));

Bu kod, sayfa yüklendiğinde sunucu ile bir WebSocket bağlantısı kurar ve ReceiveNotification adındaki olay tetiklendiğinde tarayıcıda bir uyarı kutusu gösterir.

Sunucudan Bildirim Tetikleme

Bildirimleri genellikle bir Controller içinden veya bir arka plan servisinden tetiklersiniz. Aşağıdaki örnek, bir HTTP POST isteği geldiğinde tüm kullanıcılara bildirim gönderilmesini sağlar.

[ApiController]
[Route("api/[controller]")]
public class NotificationController : ControllerBase
{
    private readonly IHubContext _hubContext;

    public NotificationController(IHubContext hubContext)
    {
        _hubContext = hubContext;
    }

    [HttpPost("send")]
    public async Task Notify([FromBody] string message)
    {
        await _hubContext.Clients.All.SendAsync("ReceiveNotification", message);
        return Ok("Bildirim gönderildi.");
    }
}

Burada IHubContext kullanılması kritiktir; çünkü Controller sınıfları doğrudan Hub'ın bir parçası değildir. Bu enjeksiyon sayesinde, herhangi bir servis katmanından bildirim tetikleyebilirsiniz.

Bildirim Yöntemlerinin Karşılaştırılması

Yöntem Avantajı Dezavantajı
SignalR (WebSockets) Çok hızlı, gerçek zamanlı Sunucu yükü artabilir
Polling (Düzenli İstek) Basit uygulama Verimsiz, yüksek trafik
Server-Sent Events Hafif, tek yönlü Sadece sunucudan istemciye
Güvenlik Uyarısı: Bildirim servislerinde XSS (Cross-Site Scripting) saldırılarına karşı dikkatli olunmalıdır. İstemciye gönderdiğiniz verileri asla doğrudan DOM'a "innerHTML" ile yazdırmayın; her zaman metin içeriği (textContent) olarak işleyin. Ayrıca, üretim ortamında Hub bağlantılarını yetkilendirme (Authorize) ile koruma altına almayı unutmayın.

Sıkça Sorulan Sorular

SignalR bağlantım neden sürekli kopuyor?

Bu genellikle ağ kesintileri veya yük dengeleyici (load balancer) ayarlarından kaynaklanır. "Sticky Sessions" (yapışkan oturumlar) özelliğinin aktif olduğundan emin olun.

Belirli bir kullanıcıya nasıl bildirim gönderirim?

Clients.User(userId).SendAsync(...) metodunu kullanarak, kullanıcı kimliği ile eşleşen spesifik istemcilere mesaj gönderebilirsiniz.

Üretim ortamında ölçeklendirme nasıl yapılır?

Uygulamanız birden fazla sunucuda çalışıyorsa, Redis arka planı (backplane) kullanarak tüm sunucuların birbirleriyle haberleşmesini sağlamalısınız.

Bildirimler için veritabanı tutmalı mıyım?

Evet, kullanıcı o an çevrimdışıysa bildirimleri kaçırabilir. Okunmamış bildirimleri veritabanında tutup, kullanıcı giriş yaptığında ona iletmek en iyi pratiktir.

SignalR yerine neden WebSockets kullanmayayım?

SignalR, WebSocket'in yanı sıra "Long Polling" gibi yedekleme yöntemlerini otomatik yönetir. Tarayıcı uyumluluğu ve hata yönetimi için SignalR çok daha güvenlidir.

İleri Düzey Bildirim Senaryoları: Arka Plan İşlemleri ve BackgroundService

Gerçek dünya uygulamalarında bildirimler genellikle bir kullanıcı etkileşimiyle değil, arka planda çalışan zamanlanmış görevler veya veritabanı değişiklikleri ile tetiklenir. Örneğin, bir sipariş durumu güncellendiğinde veya bir rapor hazırlandığında kullanıcıya bildirim göndermek için BackgroundService yapısını kullanmak en sağlıklı yöntemdir.

Bu yapıyı kurmak için IHubContext arayüzünü bir arka plan servisine enjekte etmeniz gerekir. Aşağıdaki örnek, her 10 saniyede bir tüm bağlı istemcilere sistem saati bilgisini gönderen bir servis yapısını göstermektedir:

public class NotificationWorker : BackgroundService
{
    private readonly IHubContext _hubContext;

    public NotificationWorker(IHubContext hubContext)
    {
        _hubContext = hubContext;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            await _hubContext.Clients.All.SendAsync("ReceiveNotification", 
                $"Sistem saati: {DateTime.Now.ToLongTimeString()}", stoppingToken);
            
            await Task.Delay(10000, stoppingToken);
        }
    }
}

Bildirim Sistemlerinde Performans ve Hata Ayıklama

Yüksek trafikli uygulamalarda bildirim servisinin performansını optimize etmek kritik öneme sahiptir. Bağlantı sayısının artmasıyla birlikte sunucu üzerindeki bellek kullanımı ve işlemci yükü dikkatle izlenmelidir.

Performans Optimizasyonu İçin İpuçları

  • Mesaj Boyutunu Sınırlayın: İstemciye gönderilen JSON verilerini mümkün olduğunca küçük tutun. Büyük veri setlerini doğrudan bildirimle göndermek yerine, sadece bir ID gönderip istemcinin veriyi API üzerinden çekmesini sağlayın.
  • Bağlantı Yönetimi: Gereksiz bağlantıları açık tutmayın. Kullanıcı sayfadan ayrıldığında bağlantıyı manuel olarak kapatan onclose mantığını istemci tarafında mutlaka yapılandırın.
  • Redis Backplane Kullanımı: Eğer uygulamanız birden fazla sunucu (Load Balancer arkasında) üzerinde çalışıyorsa, SignalR mesajlarının tüm sunuculara dağıtılması için Redis tabanlı bir backplane kullanmanız zorunludur.

Hata Ayıklama (Debugging) Stratejileri

SignalR bağlantı hatalarını gidermek için tarayıcı konsolundaki logları aktif hale getirmek en hızlı yöntemdir. İstemci tarafında bağlantı kurulurken LogLevel ayarını Debug seviyesine çekerek detaylı hata mesajlarını görebilirsiniz:

const connection = new signalR.HubConnectionBuilder()
    .withUrl("/notificationHub")
    .configureLogging(signalR.LogLevel.Debug)
    .build();

connection.start().catch(err => console.error("Bağlantı hatası: ", err));

Ayrıca, sunucu tarafında appsettings.json dosyanızda Microsoft.AspNetCore.SignalR için log seviyesini Information veya Debug olarak ayarlayarak, sunucuya gelen bağlantı isteklerini ve hata mesajlarını dotnet run çıktısında izleyebilirsiniz.

Sonuç

C# ile web tabanlı bildirim servisi entegrasyonu, SignalR sayesinde oldukça esnek ve yönetilebilir bir süreçtir. Bu rehberde temel bir Hub yapısı kurmayı, sunucudan istemciye mesaj iletmeyi ve bu mesajları tarayıcıda yakalamayı öğrendiniz. Bir sonraki adım olarak, kullanıcıların bildirim tercihlerini yönetebileceği bir veritabanı katmanı ekleyebilir ve bildirimlerin kalıcılığını sağlayabilirsiniz.

Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce tüm giriş verilerini doğrulayın, gerekli yetkilendirme katmanlarını ekleyin ve servis güvenliğini (SSL/TLS) yapılandırın.
Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Ev ekonomisi ve kişisel organizasyon üzerine birçok yayın yönettim. Okuyucuların günlük yaşam kalitesini artıracak uygulanabilir çözümler üretmeyi hedefliyorum.

Yorumlar (0)

Yorum Yaz