Asp.NET Core – SignalR Serisi #8 – Clients Türleri ve Kullanılan Metotlar – Caller | All | Others
Merhaba,
SignalR Hub sınıfları, client ile server arasında eşzamanlı etkileşimi kurabilmek ve server’a bağlı olan client’lar arasında isteğe özel farklı davranışlar sergileyebilmek için Caller, All ve Others özelliklerini içermektedir. Bu içeriğimizde, bu özelliklerin davranışlarını detaylarıyla inceleyecek ve ardından genel olarak kullanılan metotları değerlendireceğiz.
Client Türleri
Davranışa göre client türleri yukarıda da bahsedildiği gibi Caller, All ve Others olmak üzere üçe ayrılır;
İlgili propertylerin davranışlarını sergilemek için aşağıdaki görselleri inceleyebilirsiniz…
Caller | All | Others |
---|---|---|
![]() |
![]() |
![]() |
İleti Gönderim Metodu(SendAsync)
İleti gönderim metodu yukarıdaki Caller, All ve Others özelliklerinden kullanılanın davranışlarına göre şekillenmekle birlikte sade ve sadece ‘SendAsync’den ibarettir.
SendAsync aşağıdaki varyasyonlar eşliğinde kullanılır;
await Clients.Caller.SendAsync("receiveMessage", message);
Sadece ilgili Hub’a ileti gönderene ileti gönderir.await Clients.All.SendAsync("receiveMessage", message);
Hub’a bağlı tüm client’lara ileti gönderir.await Clients.Others.SendAsync("receiveMessage", message);
Hub’a ileti gönderen dışındaki tüm client’lara ileti gönderir.
Hub Clients Metotları
Hub üzerinden etkileşime geçilecek olan client’lar ile özelleştirilmiş davranışlar sergileyebilmek için kullanılan metotlardır.
- AllExcept
Belirtilen client’lar hariç server’a bağlı tüm client’lara bildiride bulunur.public class MyHub : Hub { public async Task AllExceptSendMessage(string[] excludedClients, string message) { await Clients.AllExcept(excludedClients).SendAsync("receiveMessage", message); } }
- Client
Server’a bağlı olan client’lar arasından sadece belirli bir client’a bildiride bulunur.public class MyHub : Hub { public async Task ClientSendMessage(string connectionId, string message) { await Clients.Client(connectionId).SendAsync("receiveMessage", message); } }
- Clients
Server’a bağlı olan client’lar arasından sadece belirtilenlere bildiride bulunur.
public class MyHub : Hub { public async Task ClientsSendMessage(string[] clients, string message) { await Clients.Clients(clients).SendAsync("receiveMessage", message); } }
- Group
Belirtilen gruptaki tüm client’lara bildiride bulunur.
public class MyHub : Hub { public async Task AddToGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); } public async Task GroupSendMessage(string groupName, string message) { await Clients.Group(groupName).SendAsync("receiveMessage", message); } }
- GroupExcept
Belirtilen grupta, belirtilen client’lar dışındaki tüm client’lara bildiride bulunur.
public class MyHub : Hub { public async Task AddToGroup(string groupName) { await Groups.AddToGroupAsync(Context.ConnectionId, groupName); } public async Task GroupExceptSendMessage(string groupName, string[] excludedClients, string message) { await Clients.GroupExcept(groupName, excludedClients).SendAsync("receiveMessage", message); } }
Not: Tüm metotlara dair UI ve Server olmak üzere ikili örneklendirmeleri makalenin en sonundaki örnek proje(leri) indirerek inceleyebilirsiniz. Bunlardan en kapsamlısı GroupExcept için yapılan örneklendirmedir. Özellikle incelemenizi tavsiye ederim.
- Groups
Birden çok gruptaki client’lara bildiride bulunur.
public class MyHub : Hub { public async Task GroupsSendMessage(string[] groupNames, string message) { await Clients.Groups(groupNames).SendAsync("receiveMessage", message); } public async Task GetGroupsClients(string[] groupsName) { List<string> datas = new List<string>(); foreach (var groupName in groupsName) { datas.AddRange(groupClients.Where(g => g.GroupName == groupName).Select(c => c.ConnectionId).ToList()); } await Clients.Caller.SendAsync("getGroupClients", datas); } }
- OthersInGroup
Bildiride bulunan client haricinde gruptaki tüm client’lara bildiride bulunur.
public class MyHub : Hub { public async Task OthersInGroupSendMessage(string groupName, string message) { await Clients.OthersInGroup(groupName).SendAsync("receiveMessage", message); } }
- User
Authentication olan kullanıcıyla ilişkili tüm client’lara bildiride bulunur. - Users
Authentication olan kullanıcılarla ilişkili tüm client’lara bildiride bulunur.
‘User’ ve ‘Users’ metotlarını ileride SignalR ile Authentication ve Authorization konularını ele alırken inceleyeceğiz.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımızda görüşmek üzere…
İyi çalışmalar…
Not: Örnek projeleri indirmek için aşağıdaki linklere tıklayınız.
User component ile admin componentlerim ayrı. Groups kullanıyorum. Userın yazdığı mesajı admin sayfasına nasıl bildirebilirim hocam? live support tarzı uygulama yapmaya çalışıyorum
Bu sorunun cevabını makalede verdiğimi düşünüyorum.
Hocam merhaba all olunca herkese mesaj gönderiyor ama Client yapıp user parametresini verince istediğim user a göndermeyi başaramadım. Kullanıcı kişi alıcının id sini girince veritabanından o id ye sahip olan kişi kimse onun ekranına mesajın ulaşmasını istiyorum nasıl yapabilirim. Kodları aşağıda belirtiyorum. Teşşekür ederim hocam.
Js Kodları
Html Kodları
Hub Sınıfı Kodları
Gencay Hocam verdiğiniz örnek proje linklerini indirdiğimizde içlerinde sln dosyası mevcut değil yani mesela MyHub adında oluşturduğunuz class ların cs dosyalarını bulamadım bende mi sıkıntı var yoksa mevcut değil mi?
Muhtemelen sende sıkıntı var Can, aa pardon Mükremin 🙂
Teker teker tüm dosyalara baktım ama sln ve cs uzantılı dosya göremedim maalesef hocam 🙂
Hepsi client, sadece bir tanesi server. Dolayısıyla .sln ve .cs dosyalarını server’da aramanı tavsiye ederim.
Hocam buradaki ConnectionId her refresh olduğunda yada kodu her çalıştırdığımızda değişiyor bunu her kullanıcı için değişmeyecek şekilde sabit connection id nasıl yapabiliriz?
Yapamazsın 🙂 Her bağlantıda yeni connection id atanır.
Anladım hocam peki belirli bir kullanıcıya mesaj gönderirken nasıl yapacağız mesela veritabanına kayıtlı bir başka kullanıcıya mesaj göndermek istersek nasıl bir yol izlemeliyiz ?
Bu sorunun cevabı bu makalede var Can. Dikkat edersen
Client
bu işlemi yapmaktadır.Evet hocam biliyorum Client o işlemi gerçekleştiriyor ama connection id her seferinde değişiyor mesela ben size mesaj göndermek istediğim zaman her seferinde connection id değişiyor size mesaj göndereceğim zaman sürekli değişen id yi girmek yerine her seferinde sadece eposta adresinizi girsem o şekilde mesajı size iletme imkanım yok mu?
Client Hub’a bağlandığı zaman kendisini tanımlayan farklı özellikleri olmalıdır. Örneğin; ‘Can’ isimli client ‘123321’ connection id ile hub’a subscribe oldu. Bu esnada; ‘Can’ isimli ‘123321’ connection id’li client hub’a bağlandı şeklinde diğer client’lar bilgilendirilmelidir. Dolayısıyla, ‘Gençay’ client’ı ‘Can’ client’ına mesaj gönderecekse, kullanıcı ‘Can’ olduğunu bilecek ama yazılım onun connection id’si olan ‘123321’ değerini elde edip ona göre gerekli datayı gönderecektir. Bu şekilde çalışman gerekmektedir.
Dikkat : Can burada bir property(ClientName, Email vs.) değeri olabilir.
Şimdi anladım hocam çok teşekkür ederim.
Kolay gelsin…