ASP.NET : (Basitçe) SignalR Nedir ?

SignalR Nedir ?

  • ASP.NET uygulamaları için gerçek zamanlı ve http tabanlı asenkron haberleşiminin kalıcı olmasını veya kopmadan devam etmesini sağlayan frameworkdür.
  • JavaScript desteği olan tüm tarayıcılarda çalışır
  • Server ve client taraflı APIs yapılmasını sağlar
  • Self-host edilebilir. Self hosting nedir ? 

SignalR çoklu-kullanıcı (multi-user) uyguglamarını gerçek zamanlı olarak yapılmasını sağlar.

Bu makale ; SignalR mimarisi ve içeriği hakkında detaylı bir anlatım yapmak değil, bunun yerine SignalR uygulaması yazmak isteyen birine başlangıç için destek sağlamak ve yardımcı olmayı amaçlamaktadır.

SignalR uygulamaları yazabilmek için üç adım :

  • SignalR bileşeni  NuGet paketi olarak yada yeni bir Visul Studio template üzerinden eklenir
  • .Net diliyle hazırladığınız server kodu yazılır
  • JavaScript ve HTML içinde client kod yazılır

Projeye SignalR yüklemek

Solution Explorer’da proje üzerine sağ tıklayarak Manage NuGet Packages seçeneğini açıyoruz. Arama textine SignalR yazıyoruz ve Microsoft ASP.NET SignalR package seçeğini install ediyoruz. Paket içeriği otomatik olarak yüklenecek ve referanslar alınacaktır.

Server Kodu

Başlangıç sınıfı

Server hangi URL’nin SignalR’a yönlendirdiğini ve yakaladığını bilmek ister. Bunu yapmak için OWIN başlangıç sınıfını ekliyoruz. Solution Explorer içindeki projemize sağ tıklıyoruz ve Owin başlangıç sınıfını ekliyoruz.

OWIN class

Zorunlu olmamasına rağmen kural gereği oluşturulan sınıfın ismi Startup olarak kalmalıdır. Yeni sınıf bizim için daha fazla birşeyler eklemeye gerek kalmadan ihtiyacımız olan kodları üretecek.


[assembly: OwinStartup(typeof(SignalRDemo.Startup))] 
 
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Buraya herhangi bir bağlantı gelebilir
        app.MapSignalR();
    }
}

Assemly özelliğine dikkat edin. Bu özellik SignalRDemo namespace içindeki Startup sınıfına startup sınıfını yükleyecek.

Hub Sınıfı

Hub sınıfları SingalR servislerini push ederler yada diğer bir deyişle iterler.  Server ve client arasındaki mesajlaşmadan ve bağlantının devamını sağlamakla sorumludurlar. Hub içinde tanımlanan public metodlar client tarafından çağrılabilir. Hub mesajları client-side metodlar tarafından çağrılan metodlara gönderir.

Diğer taraftan client bağlantısını algılar ve işler.


public class ChatHub : Hub
{
    public void Send(string name, string message)
    {
        // İstemcileri güncellemek için broadcastMessage metodunu çağırıyoruz.
 Clients.All.broadcastMessage(name, message); } }


 


Dikkat ederseniz server tarafında tanımlanan Send() fonksiyonu  client kod tarafından çağrılacak.

Client Kodu

Client kodu serverdan veri almak ve servera veri göndermek için JavaScript ile HTML’i bağlar.

ChatHub’ı referans alan bir proxy deklare edelim (Chatup sınıfını server tarafında oluşturmuştuk)


var chat = $.connection.chatHub;


Script tarafında bir geri çağırım (callback) fonskiyonu oluşturalım. Serverda yer alan hub sınıfı bu fonksiyonu tetikleyerek teker teker her istemcinin içeriğini güncelleyecek.

 

 


chat.client.broadcastMessage = function (name, message) {
   // Server tarafından tetiklenen içeriği gösteren kod
};

Hub içerinden Send() metodu çağrılır

chat.server.send(name, message);

Son olarak bağlantı başlatılır ve artık amacımıza ulaşırız.

$.connection.hub.start();
 
 

 

Muavenet

Web teknolojilerine merak salmış bir bilgisayar mühendisinin yazıları

ASP.NET : (Basitçe) SignalR Nedir ?” hakkında 4 yorum

  1. Merhaba, teşekkür ederim bu makaleniz için. Ama bunu denediğimde mesajlar o an sitede login olan herkese görünüyor. Ben bunu facebook taki gibi anlık olarak sadece belirli bi kişiye mesaj göndermek için kullanmak istiyorum. Onu nasıl yapabiliriz?

  2. Merhaba,

    Öncelikle cevabı geç verdiğim için kusura bakmayın.
    Buradaki uygulama signalR’ın nasıl çalıştığını daha iyi anlamak için gösterilmiştir. Belirli bir kişiye göndermek için öncelikle mesaj yazanların idlerini veya karşıdaki kişin ip’sini veritabanına yazdırmalısınız. Daha sonra mesajları çekerken idlere veya iplere göre çektiğinizde karşıdaki kişi kendi idsine veya ipsine ait olan mesajları görecektir. Tabi bunun için SqlDependecy kullanmanız gerekiyor ki veritabanında bir değişiklik olduğunda anlık olarak ekrana getirebilsin.

    1. Merhaba,
      Çok faydalı bir kaynak ve signalr türkçe kaynak bulmak zor.Öncelikle teşekkür ederim.
      Benim sorunum ise şu kişi login oluyor ve connectionidleri veritabanına alıyorum(login ile birlikte).ancak kullanıcı sayfalar arasında gezinirken connectionidler değişiyor bu değişiklikleri nasıl kontrol altına alabilirim

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir