SignalR Nedir ?

Furkan Alaybeg
5 min readJun 17, 2019

--

Bu yazımda gerçek zamanlı uygulama nedir, SignalR nedir, nerede kullanılır, kurulumu hakkında bilgi verip örnek proje ile bitirmeye çalışacağım.

SignalR’dan bahsetmeden önce gerçek zamanlı uygulamalar nedir, nerde kullanılır konusundan bahsetmemizde fayda olacağını düşünüyorum. En basit olarak günümüzde artan mesajlaşma uygulamalarında gelen mesajı görmek için her seferinde sayfayı yenilememiz gerekiyor. İşte tam da bu durumda gerçek zamanlı uygulamaları, sayfamızı yenilemeden sayfamızdaki verilerin güncellenmesi olarak tanımlayabiliriz. Şimdi SignalR’ı incelemeye başlayalım.

Signal R Nedir ?

SignalR, gerçek zamanlı uygulamalar geliştirmek için yazılmış açık kaynak kodlu bir .NET kütüphanedir. Normal HTTP bağlantılarında client-server iletişimi her istekte yenilenirken, SignalR ile client ve server arasında sürekli bir bağlantı sağlanır. Request-Response’den ziyade SignalR’da RPC (Remote Procedure Calls) özelliği ile tarayacımızda client tarafındaki Javascripti server tarafında çağırır. Bir veride değişiklik olduğunda Server bir Javascript metodunu çağırarak bunu Client yada Client’lara haber verir. Ancak HTTP protokolü olsaydı, bu güncellemeyi yapmak için sayfayı yenilememiz gerekirdi.

SignalR Kullanıldığı Alanlar

  1. Sosyal Medya/Mesajlaşma Uygulamaları
    Günlük hayatta kullandığımız Whatsapp, Viber, Telegram gibi mesajlaşma uygulamaları, sosyal medyada anlık olarak beğenilerin bildirimi gibi örnekler gösterilebilir.
  2. Gerçek Zamanlı İzleme (Monitoring) Uygulamalar
    Bu tür uygulamalara örnek olarak anlık canlı maç, döviz takibi, ağ verisi izleme gibi uygulama örnekleri gösterilebilir.
  3. İş Takip Uygulamaları
    İş Takibi uygulamalarına örnek olarak ise Trello, Jira gibi görev takip uygulamaları örnek gösterilebilir.

Neden SignalR ?

  1. Konfigürasyonların ve sürekli yapılması gereken (bağlantı kesildiğinde tekrar bağlanma gibi) işlemlerin SignalR kütüphanesi tarafından kolayca yapılması
  2. Veri transferi için kurulacak olan Ajax Long Polling, Forever Frame, WebSockets, Server Send Events gibi bağlantıların SignalR tarafından otomatik olarak yapılması
  3. Hub ve Persistence Connection seçeneklerini sunar. Ancak Hub kullanmamız daha kolay ve yeterli olmaktadır.

SignalR İletişim Modelleri

  1. Persistence Connection
    Persistence Connection API, SignalR’ın geliştiricilere verdiği düşük seviye iletişim protokolünü ortaya çıkarmaktadır. HTTP üzerinden SignalR servislerinin açılmasını sağlar. WCF bağlantı tabanlı API’leri kullananlar bu modele daha aşina olacaktır.
  2. Hub
    Hub bağlantısı, Persistence bağlantısı üzerine yazılmış client ve server metodlarını direkt olarak çağırmamızı sağlayan high-level bir API’dir. Ayrıca metodlara parameter ile ve model binding özelliğini de sağlamaktadır.

SignalR İletişim (Transport) Yöntemleri

SignalR yaptığı en önemli iş abstraction’dur. Javascript metodlarını sunucu tarafında çağırmaktır. Ayrıca client ve server arasında çalışacak olan real-time uygulamalarımızda gerekli olan transport yöntemini otomatik olarak seçmektedir. SignalR bağlantısı, HTTP bir bağlantı gibi başlar ve daha sonra uygunsa WebSocket bağlantısı kurulmaktadır. Bunu daha iyi anlamak için SignalR iletişim (transport) yöntemlerini incelemeye başlayalım.

Ajax Long Polling

İlk olarak Ajax Polling yönteminin bahsedilmesinin faydalı olacağını düşünüyorum. Ajax Polling’te sayfa asenkron olarak Ajax Request ve Response şeklinde çalışır. Gönderilen istekte veri varsa geri döndürür. Ancak Long Polling tekniğinde ise istek gönderilip server tarafından istek gelene kadar bekler.

Forever Frame

Bu tekniği anlamamız için İframe’i bilmemiz faydalı olmaktadır. İframe HTML tabanlı embedded bir dinleme elementidir. Bu yöntem IE8 ve alt sürümlerinde çalışır. Forever Frame bir tane İframe oluşturur ve çalışan scriptler one-way yöntemiyle real-time bağlantıyı server’dan client’e gönderir.

Server Send Event Source

Bağlantıyı text/html, text/event-stream gibi content-type ile yapmaktadır. Event-stream yeni bir veriyi dinlemeye başlayan bir yayın açar. Yeni bir event olduğunda veriyi yakalar.

WebSocket

SignalR’ın en iyi transfer yöntemidir. Eğer browser bu yöntemi destekliyorsa tarayıcı server’a istek gönderir ve server persistence-connection oluşturur. Bağlantı oluşturulduktan sonra Client ve Server arasında two-way (çift taraflı) multi-duplex ve asenkron gerçek zamanlı etkileşim olur.

Günlük hayattan bir örnek ile örneklendirmemiz gerekirse, WebSocket yöntemi yukarıdaki resim ile özetlenebilir.

SignalR Clients Metodları

All: Bu komutla giriş yapan (login) tüm kullanıcılarda, yapılan işlemerin gerçek zamanlı gösterilir.

AllExcept: Kendimiz hariç diğer tüm kullanıcılarda tetiklenen değişiklikleri gösterir. Clients.AllExpect(id) olarak çağrıldığında, verilen Id hariç diğer tüm kullanıcılarda değişiklik yapılan işlemler gerçek zamanlı gösterilir.

Caller: Geçerli olan bağlantı ID’si (giriş yapan ID) bir değişiklik yaptığında, değişiklikleri gösterir. Caller fonksiyonuna, Caller(id) ile çağrılan belirli bir kullanıcı id’si verilebilir.

Group: Bir grup içerisinde grup adı ve kendi bağlantı ID’miz hariç değişikliklerin tetiklenmesi yapılmaktadır.

SignalR Kurulumu

1. SignalR Kurulumu

Asp.Net MVC web uygulamamızda SignalR kullanmak için, Nuget Package Managerden SignalR kütüphanesinin kurulumunu yapılması gerekir.

2. SignalR Konfigürasyonu

Kurulumu tamamladıktan sonra, Startup.cs dosyasında SignalR’ı çalışır hale getiren app.MapSignalR() konfigürasyonu yapılır.

3. SignalR scriptlerini referans vermek

Konfigürasyon ayarından sonra SignalR’ı kullanacağımız html sayfasında jquery.signalR ve signalr/hub scriptleri referans olarak gösterilir.

4. Hub sınıfını oluşturmak

Server ve Client arasında iletişimi sağlamak için yukarıda bahsettiğimiz bir Hub sınıfı oluşturulur. SampleHub isimli oluşturduğumuz Hub’da Send isimli server-side mesaj gönderme metodu ve client tarafında çağrılacak olan receiveMessage fonksiyonu oluşturulur.

5. SignalR HTML dosyası

Hub sınıfımızı oluşturduktan sonra, mesajı gönderip alacağımız HTML önyüz ekranı oluşturulur.

6. SignalR Javascript dosyası

Son olarak Önyüz ve Hub sınıfı oluşturduktan sonra, istemci (client) tarafında metodları çağırmak üzere Javascript dosyası oluşturulur. Send butonu tetiklendiğinde Hub bağlantısı başlatıp, server ve client metodlarının gerçek zamanlı haberleşmesi sağlanmış olur.

SignalR Örnek Proje

Yukarıda resimde görüldüğü üzere SignalR kütüphanesi kullanılarak gerçek zamanlı mesajlaşma uygulaması gerçekleştirildi. Uygulamada gerçek zamanlı dashboard ve bildirim paylaşma özellikleride bulunmaktadır. Projesinin kaynak kodlarına aşağıdaki adresten ulaşabilirsiniz.

Umarım faydalı bir yazı olmuştur. Gelecek yazılarda görüşek üzere.
İyi Çalışmalar…

--

--

Furkan Alaybeg

Big Data Engineer | SQL | PySpark | Hadoop | Apache Airflow | Apache Flink