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

1 Cevap

  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 […]

Bir cevap yazın

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

*