İçeriğe geç

ASP.NET Core 2.0 için SignalR Duyurusu

Geçtiğimiz günlerde ASP.NET Core ile uyumlu olarak çalışacak olan SignalR preview sürümü yayınlandı ve hatırlayacağımız üzere ASP.NET Core 1.x.x sürümünde SignalR desteklenmiyordu.

Neler Yeni?
Microsoft bizlere yeni hazırlanan SignalR’ın baştan yazıldığını söylüyor. Ayrıca yeni SignalR’ın daha basit, daha güvenilir ve kullanımının daha kolay olduğunu da belirtiyorlar.

signalr

JavaScript/TypeScript Client
SignalR’ın bu sürümü yeni bir javascript istemcisini destekler. Bu istemci TypeScript ile yazılmıştır ve JQuery bağımlılığı ortadan kaldırılmıştır. İstemci birkaç ek bağımlılık ile Node.js’den kullanılabilir. Bu yeni javascript istemcisi Chrome, FireFox, Edge, Safari ve Opera gibi tarayıcıların yanında Internet Explorer 11, 10, ve 9 sürümlerinde kullanılabilir. Internet Explorer 8 ve daha düşük sürümlerde desteklenmez.

Binary Protocol Desteği
.Net Core için hazırlanmakta olan SignalR teknolojisi 2 protokolü destekler. Bunlar Json üzerinden bir text protokol ve msgpack üzerinden binary protokolleridir. MessagePack protocol Json protokolüne göre daha küçüktür. Örneğin, 1’in tam sayı değerini döndüren bir hub yöntemi, MessagePack’i kullanırken sadece 16 bayt iken JSON tabanlı protokol kullanılırken 43 bayt olmaktadır.

Custom Protocol Desteği
SignalR Hub protokol yapısı şuradaki adreste dökümante edilmiştir ve özel protokol geliştirmeye uygun durumdadır.

Neler Değişti?
ASP.NET Core için SignalR’a birkaç yeni özellik eklenmiş olmanın yanında bazı mevcut özelliklerin desteğini kaldırmaya veya çalışmalarını değiştirmeye karar verilmiş. Örneğin eski SignalR sürümü ile uyumlu olmaması gibi bir durum söz konusudur. Bu şuna yol açar: Eski sunucuyu yeni istemcilerle veya eski istemcileri yeni sunucuyla kullanamazsınız. Aşağıda, SignalR’nin yeni sürümünde kaldırılan veya değiştirilen özellikler bulunmaktadır.

  • Basitleştirilmiş Bağlantı Modeli:
    Mevcut SignalR sürümünde, istemci sunucuya bir bağlantı başlatmayı dener ve başarısız olursa farklı bir transfer kullanmayı dener. İstemci, transferlerden herhangi biriyle sunucuya bağlanamadığında bağlantıyı başlatamaz. Bu özellik, yeni SignalR ile artık desteklenmemektedir. Bir diğer desteklenmeyen özellik tekrar bağlantının denenmesi özelliğidir. Bir önceki SignalR sürümünde bağlantı koptuğunda tekrardan bağlantının denenmesi durumu söz konusuydu.
  • Her Bağlantı için Tek Hub:
    Yeni SignalR her bağlantı için yeni Hub desteklemez. Bunun kimlik doğrulama özelliğini kolaylaştığını belirtiyorlar.

Örnek Uygulama:
Kullanıcıların bir konsol uygulaması üzerinden mesajlaşmasını sağlayan basit bir uygulama hazırlayacağız. Uygulamamızda Hub Proxy’nin yer alacağı bir server projesi ve konsol üzerinden mesajlaşma işlemini gerçekleştiren bir client proje yer alacak.

İlk yapacağımız iş ihtiyacımız olan SignalR Server paketini nuget ortamından kurmak olacaktır. İndirme işlemi için şu adresi kullanabiliriz.

Şimdi ismini Chat olarak belirteceğimiz Hub nesnemizi oluşturalım. Burada 2 paremetre alan ve mesajları tüm kullanıcılara ileten bir Task metodumuz yer alacak.

    public class Chat : Hub
    {
        public Task Send(string Message1, string Message2)
        {
            return Clients.All.InvokeAsync("Send", Message1, Message2);
        }
    }

Şimdi Startup dosyasında belli başlı(DI tanımı ve middleware tanımlaması) araylamaları yapmamız gerekli. İlk olarak ConfigureServices metodu içinde servislere SignalR’ı ekleyelim.

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSignalR();
        }

Şimdi middleware tanımı için Configure metodu içinde aşağıdaki kod bloğunu ekleyelim.

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseSignalR(routes =>
            {
                routes.MapHub<Chat>("chat");
            });
        }

Şimdi kullanıcıların birbirleriyle mesajlaşmasını sağlayacağımız konsol projesi oluşturalım. Server tarafındaki Hub ile iletişime geçmeyi sağlayacak olan bir connection nesnesine ihtiyacımız olacak. Aşağıdaki kod bloğu ile bunu hazırlayabiliriz.

            var connection = new HubConnectionBuilder().WithUrl("http://localhost:19715/chat")
                                                       .WithConsoleLogger()
                                                       .Build();
            connection.StartAsync();

WithConsoleLogger kullanmamızın sebebi konsol uygulaması başlatıldığında bize bağlantı ile ilgili bilgileri ekrana yazacak olmasındandır. Örneğin transfer modu, connection Id, bağlantı tarihi gibi.

signalr

Şu aşamada Hub içinde bulunan Send metodunu doldurmamız gerekecek. Kullanıcılardan gelen input ve kullanıcı kimliği gibi bilgileri ekrana yazdırmamız yeterli olacak.

            connection.On<string, string>("Send", (data1, data2) =>
            {
                Console.WriteLine($"{"User_"}{data1}{": "} {data2}");
            });

Artık geriye sadece kullanıcıdan gelen inputun alınması ve Send metodunun tetiklenmesi işlemi kaldı. Kullanıcı kimliği için bir Guid hazırlayabiliriz.

            string user = Guid.NewGuid().ToString();
            string value = Console.ReadLine();
            while (value != string.Empty)
            {
                connection.InvokeAsync("Send", user, value);
                value = Console.ReadLine();
            }

Projedeki kaynak kodların tamamını incelemek için şuradaki adresi kullanabilirsiniz. Herkese mutlu kodlamalar dilerim.

Tarih:ASP .NET Core

İlk Yorumu Siz Yapın

Bir cevap yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.