05. Gerçek zamanlı uygulamalar: SignalR

ASP.NET Core SignalR, uygulamalara gerçek zamanlı web fonksiyonelliği eklemeyi kolaylaştıran açık kaynaklı bir kütüphanedir. Gerçek zamanlı web fonksiyonelliği, sunucu tarafı kodunun istemcilere anında içerik iletmesini sağlar. Bu bölümde ASP.Net Core tanıtıldığı için bu kütüphane seçilmiştir. Bu konu da ünlü olan diğer bir kütüphane Socket.IO’dur. Bu bölümde basit bir örnekle SignalR tanıtılacaktır.

SignalR nerelerde kullanılabilir:

  • Sunucudan sık sık güncelleme gerektiren uygulamalar: Oyunlar, Sosyal Ağlar, Oylama, Açık arttırma, Haritalar…
  • Monitoring (izleme) uygulamaları: şirket kontrol paneli, anlık satış güncellemeleri, seyahat uyarıları, borsa…
  • İşbirlikçi uygulamalar: Beyaz tahta uygulamaları, takım toplantı uygulamaları
  • Uyarı veren uygulamalar: Social network, email, chat, oyunlar…

SignalR, sunucudan istemciye uzak yordam çağrıları (RPC) oluşturmak için bir API sağlar. RPC’ler, istemcilerde sunucu tarafındaki .NET Core kodundan JavaScript fonksiyonlarını çağırır. ASP.NET Core için SignalR’nin bazı özellikleri:

  • Bağlantı yönetimini otomatik olarak yürütür.
  • Tüm bağlı istemcilere aynı anda mesaj gönderir. Örneğin, bir sohbet odası.
  • Belirli istemcilere veya müşteri gruplarına mesaj gönderir.
  • Artan trafiği idare etmek için dengeler.

İletişim

SignalR, gerçek zamanlı iletişimi yürütmek için çeşitli teknikleri destekler:

  • WebSockets
  • Server-Sent Events
  • Long Polling

SignalR, sunucu ve istemci özellikleri dahilinde en iyi taşıma yöntemini otomatik olarak seçer.

Hubs

SignalR, istemciler ve sunucular arasında iletişim kurmak için hub’ları kullanır. Bir hub, bir istemci ve sunucunun birbirine yöntemleri çağırmasına izin veren yüksek seviyeli bir pipeline’dır.  Güçlü bir şekilde yazılan parametreleri, model bağlamaya olanak tanıyan yöntemlere iletebilirsiniz. SignalR iki yerleşik hub protokolü sağlar:

  • JSON’a dayalı bir metin protokolü
  • MessagePack’i temel alan bir ikili protokol.

MessagePack genellikle JSON ile karşılaştırıldığında daha küçük mesajlar oluşturur. Eski tarayıcılar, MessagePack protokol desteği sağlamak için XHR seviye 2’yi desteklemelidir.

Hublar, istemci tarafı metodun adını ve parametrelerini içeren iletileri göndererek istemci tarafı kodunu çağırır. Metot parametreleri olarak gönderilen nesneler, yapılandırılmış protokol kullanılarak deserialize edilir. İstemci, istemci tarafı kodundaki adı bir metotla eşleştirmeye çalışır. İstemci bir eşleşme bulduğunda, metodu çağırır ve deserialize edilmiş parametre verisine geçer.

Diğer konular gibi bu konu da çok geniş bir konudur. Bu bölümde basit bir örnek ile gerçek zamanlı iletişim yapan bir uygulama geliştirilecektir. Diğer konuları merak ediyorsanız tıklayın.

05.01. Proje açma

Öncelikle bir klasör oluşturalım ve File -> Open Folder yaptıktan sonra yeni bir terminal açın.

SignalR istemci kütüphaneleri indirmek için öncelikle LibMan aracını kuralım.

LibMan aracı üzerinden SignalR istemci tarafı kütüphanesini wwwroot klasörüne indirilelim.

05.02. SignalR Hub oluşturma

Bir hub, istemci-sunucu iletişimini yöneten yüksek seviyeli bir pipeline olarak hizmet eden bir sınıftır.

  • SignalRChat proje klasöründe bir Hublar klasörü oluşturun.
  • Hublar klasöründe, aşağıdaki kodla bir ChatHub.cs dosyası oluşturun.

ChatHub sınıfı, SignalR Hub sınıfından miras alır.Hub sınıfı bağlantıları, grupları ve mesajlaşmayı yönetir. SendMessage yöntemi, bağlı herhangi bir istemci tarafından çağrılabilir.Alınan mesajı tüm istemcilere gönderir.SignalR kodu, maksimum ölçeklenebilirlik sağlamak için eşzamansızdır.

Starthub.cs dosyasına aşağıdaki satırları ekleyelim.

Bu sayede sunucu tarafı hazır.

05.03. SignalR İstemci tarafı

Pages\Index.cshtml Razor sayfasını ekleyelim.

  • Ad ve mesaj için text bölümlerini oluşturup, işlemi aktive etmek için submit button’u ekledik.
  • id=”messagesList” olan etikete SignalR hub’undan alınan mesajları gösteren bir liste oluşur.
  • SignalR istemci tarafı Javascript dosyalarını bağladık. Şimdi chat.js’yi wwwroot klasöründeki js clasörü içine yaratalım ve aşağıdaki kodları ekleyelim.

Uygulamayı debug edin ve browser açılınca, aynı URL ile ikinci bir sayfa açın. Chat yapmaya başlayabilirsiniz 🙂