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.
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.
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.
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 ..