SignalR ile Gerçek Zamanlı Bildirim Uygulaması

SignalR Nedir ?

SignalR, microsoft tarafından geliştirilmiş, gerçek zamanlı uygulamalar geliştirmeyi kolaylaştıran teknolojidir.WebSocket Api ile istemci-sunucu arasındaki iletişimi (çift yönlü) sağlar. Eğer WebSocket kullanılamıyorsa, kodunuzda değişiklik yapmadan, diğer teknolojiler ile de çalışabilmektedir.
Hosting işlemi için Open Web Interface (OWIN) kullanılabilmektedir. Çalışma mantığını hazırladığımız senaryo üzerinde daha detaylı olarak anlatıyor olacağız.

resim

SignalR uygulaması geliştirmek için 2 şeye ihtiyacımız olacak:
1- HUB sınıfı (Sunucu tarafında)

2- SignalR istemcisi (istemci tarafında)

signalR’nin güzel özelliklerinden birisi de , web, mobil, masaüstü istemci türlerini desteklemesidir. istemci bir web tarayıcısı, bir mobil uygulama ya da bir konsol uygulaması olabilir.

clients

Uygulama Senaryosu :

1- Öncelikle Sunucu tarafından SignalR hub tanımlayacağız .

2- Bu HUB’a bağlantı sağlayacak olan konsol tabanlı istemcilerimizi oluşturacağız.

3- İstemci uygulamasından sunucuya mesaj göndereceğiz

4- Sunucudan istemcilere mesaj göndereceğiz.

func

SignalR HUB Tanımlama

Hub sınıfı, SignalR teknolojisinin temel unsurudur. İstemci ve sunucu arasındaki haberleşmeyi sağlamaktadır. HUB tanımlamadan önce, HUB barındırma(hosting) yöntemini belirlemeliyiz. 3 farklı barındırma yöntemi bulunmaktadır:

1- Self Hosting

2- IIS Hosting

3- Windows- Servis hosting

Örnek uygulamamızda,SignalR HUB’u self-hosting yöntemi ile, konsol uygulaması içerisinde barındırıyor(hosting) olacağız.
Geliştirmeye başlamadan önce IDE(visual Studio) paket yöneticisi(Nuget PM) ile bazı paketleri import etmemiz gerekecek.

  PM> Install-Package Microsoft.AspNet.SignalR.SelfHost
  
  PM> Install-Package Microsoft.Owin.Cors

ilk kurduğumuz paket signalR, ikinci kurulumunu yaptığımız paket hosting işlemi içindir(OWIN).

Sunucu Tarafı

Sunucudan istemcilere bildirim göndermenin birçok yolu vardır. Belirlediğimiz kullanıcılara, ya da tüm istemcilere aynı anda bildirim gönderilmesi gibi.

1. HUB Sınıfı Oluşturma

Bildirim gönderimi yapacak olan Hub sınıfımızı tanımlamamız gerekmektedir. Öncelikle HUB sınıfından devralınan, public HUB sınıfımızı oluşturup, sonra bildirimi yapan ilgili metodumuzu yazacağız.

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalROrnek
{
   [HubName("TestHub")]
    public class TestHub:Hub
    {
        public void PushNotification(string Message)
        {
            Clients.All.GetNotification(Message); // İstemci tarafı bu method üzerinden bildirimleri alacak.

        }

    }
}

Clients.All.GetNotification(Message): Kod bloğu ile bağlı istemci uygulamalarına, sunucu tarafından bildirim yapılacağı zaman, GetNotication methodu üzerinden yapılacaktır.

2. Startup Sınıfı Oluşturma

HUB’ın aktifleştirilmesi ve uygulamada yer alan tüm SignalR Hub’ların uygulamamızda map edilmesi(eşleştirilmesi) işlemini yapacağımız sınıftır.

using System;
using Microsoft.Owin.Cors;
using Owin;

namespace SignalROrnek
{
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();

        }
    }
}

3. HUB hosting

Sıra geldi SignalR Hub’ımızı yayınlamaya. Hub’ımız localhosta 8080 portunda barındırıyor olacağız.

using System;
using Microsoft.Owin.Hosting;

namespace SignalROrnek
{
    class Program
    {
        static void Main(string[] args)
        {

            string hostUrl = @"http://localhost:8080/";
            using (WebApp.Start <Startup> (hostUrl))
            {
                Console.WriteLine($"Sunucu {hostUrl} adresinde çalışıyor ...");
                Console.ReadLine();

            }

        }
    }
}

Eğer sunucu çalışıyorsa , web tarayıcınızdan http://localhost:8080/signalR/hubs adresine gittiğinizde SignalR kodlarını göreceksiniz.

İstemci Tarafı

1. İstemci Uygulaması Geliştirme

Yazımızda, SignalR’nin istemci tarafından web, mobil ve desktop istemci türlerini desteklediğini belirtmiştik. Örnek uygulamamızda sunucu tarafında olduğu gibi istemci tarafında da konsol uygulaması üzerinde çalışacağız.

öncelikle ilgili paketi Nuget PM ile kuralım :

  
PM> Install-Package Microsoft.AspNet.SignalR.Client
using System;
using Microsoft.AspNet.SignalR.Client;


namespace ClientSide
{
    class Program
    {
        static void Main(string[] args)
        {
            IHubProxy _hub;
            string hostUrl = @"http://localhost:8080/";
            var connection = new HubConnection(hostUrl); //Hub bağlantısı  
            _hub = connection.CreateHubProxy("TestHub"); // Hub proxy oluşturma 
            connection.Start().Wait(); // SignalR Hub bağlanıyor
            string girilen = null;
            while((girilen=Console.ReadLine())!=null)
            {
               // Sunucu tarafındaki PushNotification methodu çağrılır. Konsoldan girdisi, methoda parametre olarak gönderilir. 
               _hub.Invoke("PushNotification", girilen).Wait(); 

            }
        }
    }
}

Yukarıda yer alan istemci örneğinde SignalR Hub’a bağlanıp, sunucu tarafından bildirim yapan PushNotification methodunu çağırdık.Bu method kullanıcıya gönderilecek bildirimi parametre olarak alıp, istemci tarafına GetNotification methodu üzerinden iletecektir.
Diğer bir istemci oluşturup, sunucudan gelen mesajı gösterelim .

using System;
using Microsoft.AspNet.SignalR.Client;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            IHubProxy _hub;
            string hostUrl = @"http://localhost:8080/";
            var connection = new HubConnection(hostUrl);
            _hub = connection.CreateHubProxy("TestHub");
            connection.Start().Wait();
            _hub.On("GetNotification", x => Console.WriteLine(x)); // Sunucu tarafında TestHub sınıfında tanımlanan method.
            Console.ReadLine();
        }
    }
}

Yukarıdaki örnekte, hubProxy tanımlayıp, SignalR Hub’ımıza bağlandık. Daha sonra sunucu tarafından gönderilen bildirim “GetNotification” methodu ile istemciye iletildi. İlgili eylemin(action) çalışması sağlandı. (x => Console.WriteLine(x))

Seçili İstemciye Bildirim Gönderme

Bu senaryomuzda sadece belirli istemcilere bildirim göndereceğiz.
Öncelikle istenilen istemciye bildirim yapmak için, IHubConnectionContext arayüzü, Client methodunuz kullanacağız. SignalR Hub sınıfımızı (TestHub) şu şekilde yeniden düzenleyelim.

using System;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignalROrnek
{
   [HubName("TestHub")]
    public class TestHub:Hub
    {
        public void PushNotification(string message)
        {
            string connectionId = Context.ConnectionId;
            Clients.Client(connectionId).GetNotification(message);
       
        }
    }
}

Yukarıdaki örnekte, sunucuya mesaj gönderen istemcinin, yani PushNotification methodunu invoke eden istemcinin connectionID değeri alınarak,

Clients.Client(connectionId).GetNotification(message)

kodu ile sadece o istemciye bildirim gönderilmesini sağladık.

SignalR konusunda anlatacaklarımız şimdilik bu kadar. İlginize teşekkürler ..

February 11, 2020 tarihinde oluşturuldu.