Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Asp.NET Core – SignalR Serisi #2 – SignalR Server Uygulaması

Merhaba,

SignalR Yazı Serisinin bu ikinci makalesinde SignalR’ın server tarafının nasıl inşa edildiğini ve ayağa kaldırıldığını inceleyeceğiz.

Şimdi, herşeyden önce yukarıdaki görseli incelersek eğer SignalR uygulamasının client ile server arasındaki ilişkiden ibaret olduğunu ve ilk etapta server’ın inşa edilip ardından ona uygun client tasarımının yapılması gerektiğini söyleyebiliriz. O yüzden bu makalemizde server’ın inşasını ele alacak, bir sonraki içeriğimizde ise bu server’a uygun client tasarımının nasıl olacağını konuşacağız.

SignalR Server Uygulamasını Oluşturalım

SignalR server uygulamasını oluşturabilmek için Visual Studio editörü üzerinden bir Asp.NET Core – Web API yahut MVC uygulamasının oluşturulması yeterli olacaktır ve ekstradan bir kütüphanenin yüklenmesine gerek kalmaksızın SignalR direkt olarak uygulama üzerinde konfigüre edilebilir vaziyette dahili gelecektir.

Bizler pratiksel açıdan örneklendirmeye Asp.NET Core – Web API üzerinden devam edeceğiz. Bu temel hazırlıktan sonra adım adım aşağıdaki önergeleri uygulayınız;

  • Adım 1
    SignalR’ın kalbinde ‘Hub’ dediğimiz merkezi yapılar var demiştik. Client ile server arasındaki tüm veri akışı bu hub’lar üzerinden gerçekleştirilmektedir. Özünde hub’lar birer class’tır. Bu yüzden bu class’ların uygun yerde tutulması proje tasarımı açısından zaruridir. Bunun için uygulamanın ana dizininde ‘Hubs’ isminde bir klasör oluşturularak işe başlanabilir.
    Asp.NET Core - SignalR Serisi #2 - SignalR Server Uygulaması
    Oluşturulan klasör içerisine hub’larımızı oluşturacağız. Bizler örneklendirme açısından ‘MyHub’ isminde bir class eklemiş bulunmaktayız.
  • Adım 2
    Bir class’ın hub olabilmesi için Microsoft.AspNetCore.SignalR kütüphanesindeki ‘Hub’ sınıfından türemesi lazımdır.

        public class MyHub : Hub
        {
        }
    

    Yukarıdaki örnekte olduğu gibi ‘MyHub’ sınıfı ‘Hub’tan türetildiği için artık bir hub sınıfı olmuştur. Dolayısıyla bu sınıf client tarafından tetiklendiğinde SignalR mekanizması sayesinde server’ın da client’ı tetiklemesini sağlayacaktır.

  • Adım 3
    ‘MyHub’ sınıfının içerisine client’lara bilgi/veri/mesaj gönderebilmesi için bir metot oluşturulması gerekmektedir. Bizler şimdilik bu metoda ‘SendMessage’ ismini verebiliriz.

    Bunun için aşağıdaki örneği inceleyiniz;

        public class MyHub : Hub
        {
            public async Task SendMessageAsync(string message)
            {
                await Clients.All.SendAsync("receiveMessage", message);
            }
        }
    

    ‘SendMessageAsync’ metodu tetiklendiğinde ‘Clients‘ property’si üzerinden ‘receiveMessage’ isimli metoda subscribe/abone olan ‘All‘ yani tüm client’lara ilgili mesaj gönderilecektir.

    Burada ‘Clients’ property’sine dikkatinizi çekmek istiyorum. Bu property, ‘Hub’ base class’ından gelmekte ve bilgi trafiğinde client’ları temsil etmektedir. ‘Clients.All’ komutu ise adı üzerinde tüm client’lara karşılık gelmektedir. SignalR mekanizması, ‘SendAsync’ fonksiyonu içerisinde tanımlanmış olan değere karşılık(receiveMessage) client’lar da subscribe olunan bir metot beklemekte ve hub üzerinden ‘SendMessageAsync’e herhangi bir tetikleme olduğu vakit direkt olarak client’ları da ilgili fonksiyon üzerinden bilgilendirmektedir.

  • Adım 4
    Tüm bu işlemler neticesinde ‘Startup.cs’ dosyasına aşağıdaki konfigürasyonların yapılması gerekmektedir.

        public class Startup
        {
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddControllers();
                services.AddSignalR();
            }
    
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                    endpoints.MapHub<MyHub>("/myhub");
                });
            }
        }
    

    Yukarıdaki ayarlara göz atarsanız eğer yapılması gereken sadece ‘ConfigureServices’ içerisinde 6. satırda olduğu gibi ‘AddSignalR’ servisini çağırmak ve ‘Configure’ içerisinde ise 21. satırdaki gibi tasarlanan hub’un endpoint’ini ayarlamaktır. Burada tanımlanan endpoint 'https://localhost:5001/myhub' şeklinde olacaktır.

Client tarafından Hub’a gönderilen her bir istek neticesinde ilgili sınıftan yeni bir nesne oluşturulacaktır. Dolayısıyla global tanımlanan tüm property yahut field’ların static tanımlanması gerekmektedir.

İşte bu kadar basit… SignalR’da en sade haliyle bir hub’ı ağaya kaldırmak bu kadar sade ve kolaydır. Bir sonraki içeriğimizde konumuz, tanımladığımız bu server ile iletişim kuran client tasarımı olacaktır.

O halde siz bu makaleyi okurken bende sonraki makalenin ilk mürekkeplerini akıtmaya başlamak üzere noktayı koyuyorum…

İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Not : Örnek uygulamayı indirmek için buraya tıklayınız.

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. Can dedi ki:

    Hocam merhaba, endpoints.MapHub(“/myhub”) burada parantez içinde verdiğiniz /myhub ifadesi sembolik mi yada nerede kullanıyoruz nerede işimize yarıyor son olarak signalr uygulamasını nasıl private yapabiliriz mesela 10 kullanıcı sisteme login olduğu zaman 2 kişi arasında gerçekleşen mesajlaşma işlemini diğer 8 kişide login olmuş ise görebiliyor bunu nasıl engelleyebiliriz. Teşekkür ederim.

    • Gençay dedi ki:

      1. sorunun cevabı : Hayır, sembolik değil. Client’ların veri iletişimini sağlayabilmesi için fiziksel bir endpoint tanımlanması gerekmektedir. İlgili ifade onu temsil etmektedir. Tabi ki de öntanımlı olmadığı için değiştirilebilir, /ahmet /mehmet vs. yapılabilir lakin burada ki içerik bir prototipten ziyade direkt bir örnek barındırdığı için fiziksel olarak temsil edilmiştir.

      2. sorunun cevabı : Seriyi okursanız yanda adresi verilen 8. makalede cevabı bulunmaktadır. İlgili makale için : Clients Türleri ve Kullanılan Metotlar – Caller | All | Others

      Kolay gelsin…

  2. Can dedi ki:

    Hocam kusura bakmayın serinin hepsini bitirmeden sormuşum, okudum anladim ve aradığım cevabı sayenizde buldum. Çok teşekkür ederim.

  1. 08 Eylül 2020

    […] Yazı Serimizin en sonuncu SignalR Server Uygulaması başlıklı makalesinde Asp.NET Core Web API üzerinden bir SignalR server uygulamasının nasıl […]

  2. 23 Eylül 2020

    […] Asp.NET Core – SignalR Serisi #2 – SignalR Server Uygulaması […]

Bir cevap yazın

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