ASP.NET Core SignalR
.NET Core platformunda WebSocket ve çeşitli protokolleri kullanarak anlık olarak çalışan uygulamalar geliştirmeye imkan veren SignalR nedir, kurulumu ve kullanımı ile ilgili bilgiler yer alıyor.
SignalR nedir?
SignalR WebSocket ve çeşitli protokolleri kullanarak anlık mesajlaşma, oyun ve gerçek zamanlı uygulamalar geliştirmeye imkan veren IETF RFC 6455 kurallarının .NET platformu için uyarlanmış halidir.
SignalR sayesinde .NET platformunda WebSocket sunucusu oluşturabilir ve istemci kütüphanesi ile yönetebiliriz.
Detaylı bilgi için HTML5 WebSocket yazıma bakabilirsiniz.
SignalR sunucu ve istemci olmak üzere iki parçadan oluşmaktadır.
SignalR kurulumu
SignalR .NET Core ile birlikte gelmektedir.
.NET Core hakkında detaylı bilgi için .NET Core yazıma bakabilirsiniz.
SignalR kullanımı
SignalR kullanımı için öncelikle sunucunun oluşturulması gerekir.
dotnet new webapp
dotnet new mvc
.NET projesi oluşturduktan sonra Startup.cs dosyasına SignalR servisi eklenir.
public void ConfigureServices(IServiceCollection services) {
// Diğer komutlar
services.AddSignalR();
}
Servis eklendikten sonra SignalR sunucusunun hizmet vereceği sınıf ve adres ayarlanır.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
// Diğer komutlar
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/chatHub");
});
}
.NET 5 sonrası ayarlar aşağıdaki gibidir.
SignalR servisi eklenir.
builder.Services.AddSignalR();
SignalR servis ayarları yapılır.
app.MapHub("/chatHub");
Burada ChatHub gelen isteklerin yönetildiği sınıfı /chatHub ise sunucu adresini ifade eder.
SignalR isteklerin yönetilmesi
Servis ve servis ayarları yapıldıktan sonra gelen isteklerin yönelmesi için Microsoft.AspNetCore.SignalR alanında yer alan Hub sınıfı NYP özelliği ile kalıtım alınarak isteklerin yönetimi sağlanır.
using Microsoft.AspNetCore.SignalR;
namespace SignalR {
public class ChatHub : Hub { }
}
Hub sınıfı bağlı istemcileri yönetmek için Clients, mevcut istemci bilgisi için Context ve istemcileri gruplamak için Groups özelliklerine ve çeşitli metotlara sahiptir.
Bir istemci bağlanırken OnConnectedAsync metodu ve bağlantı sonlandırırken OnDisconnectedAsync metodu tetiklenir.
public override Task OnConnectedAsync() {
System.Console.WriteLine("Yeni bir bağlantı: " + Context.ConnectionId);
Clients.All.SendAsync("YeniBaglanti", "Yeni bir giriş algılandı.", Context.ConnectionId);
return base.OnConnectedAsync();
}
İstemci bağlantı isteği gönderdiğinde oluşturulan bağlantı bilgisine Hub sınıfında yer alan Context özelliği ConnectionId değeri ile ulaşmış olduk.
Clients özelliği SendAsync metodu ile sunucuya bağlı istemcilere mesaj gönderdik.
Metodun ilk parametresi (YeniBaglanti) istemcide çalışacak metodu diğer parametreler iste gönderilecek verileri ifade eder.
Clients özelliği ile sadece belirli istemciye mesaj göndermek için AllExcept, gruba mesaj göndermek için Group gibi metotlara sahiptir.
Burada gelen istekler SignalR uygulamasına göre bir List, Directory gibi veri yapısında veya veritabanında saklanarak işlem yapılabilir.
Ayrıca Context özelliği Abort metodu ile gelen istek reddedilebilir.
public override Task OnDisconnectedAsync(System.Exception? exception) {
System.Console.WriteLine("Kapatılan bağlantı: " + Context.ConnectionId);
Clients.All.SendAsync("KapatilanBaglanti", "Bağlantı kapatıldı.", Context.ConnectionId);
return base.OnDisconnectedAsync(exception);
}
Bağlantı kapatıldığında OnDisconnectedAsync metodunda ile OnConnectedAsync metodunda olduğu gibi bağlantı bilgisine ulaşarak bu bağlantı bilgisi üzerinden işlem yapabiliriz.
SignalR kullanımı bundan ibarettir.
SignalR istemci yönetimi
Oluşturulan SignalR uygulamasını kullanabilmek için çeşitli programlama dilleri için geliştirilen istemci kütüphanelerini kullanabiliriz.
Bu kütüphaneler SignalR sunucusu ile iletişimi iyi bir şekilde yönetmek için çeşitli hazır işlevlere sahiptir.
JavaScript için SignalR Client JavaScript dosyasını çeşitli CDN hizmetleri sayfalarından temin ederek kullanabiliriz.
https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.5/signalr.min.js
NOT: SignalR sürümüne göre metotlar farklılık gösterir.
SignalR sunucu bağlantısı
JavaScript kütüphanesi ile SignalR sunucu bağlantısı için HubConnectionBuilder sınıfı kullanılır.
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").build();
withUrl metoduna SignalR sunucu adresini yazarak bağlantı ayarları yapmış olduk.
Bağlantı ayarları yapıldıktan sonra HubConnection sınfında yer alan start, stop, on, off, onclose, invoke metotları kullanarak sunucu ile iletişim yönetilir.
connection.start().then(function(){
console.log("Bağlantı sağlandı.");
}).catch(function (err) {
console.log("Hata oluştu:" + err);
});
Örneğin; Yukarıda oluşturduğumuz sunucu YeniBaglanti metodunu istemciye gönderdiğinde bu metodu aşağıdaki gibi kullanabiliriz.
connection.on('YeniBaglanti', function(mesaj, id) {
console.log(mesaj);
console.log(id);
});
NOT: Sunucu parametre sayısı ile istemci parametre sayısına dikkat edin!
İstemci üzerinden sunucudaki bir metodu çalıştırmak için invoke metodu kullanılır.
connection.invoke('Mesaj', 'Merhaba SignalR');
Metot SignalR sunucusunda Mesaj metoduna parametre olarak Merhaba SignalR değerini gönderecektir.
NOT: Metodun çalışması için SignalR sunucusuna Mesaj metodunun eklenmesi gerekir.
public async Task Mesaj(string mesaj) {
// Burada gelen mesaj ile işlemler yapılabilir.
await Clients.All.SendAsync("BirMesajVar", mesaj);
}
Mesaj metodu ile istemciden Gelen değeri tekrar tüm istemcilere gönderdik.
Ayrıca gelen istek türüne göre özel bir gruba mesaj atma, belirli bir istemciye mesaj atma gibi işlemler de yapabiliriz.
.NET Core SignalR ile ilgili örneğe buradan ulaşabilirsiniz.
.NET Derslerine buradan ulaşabilirsiniz.
Hayırlı günler dilerim.