SignalR Hub'ları ve Bağlantılar
Bir SignalR hub'ı oluşturun, ASP.NET Core'da eşleyin ve JavaScript ile .NET istemcilerinden WebSocket bağlantıları kurun.
SignalR Hub'ları ve Bağlantılar, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.
SignalR Nedir?
SignalR, sunucular ve istemciler arasında gerçek zamanlı, çift yönlü iletişim sağlayan bir ASP.NET Core kitaplığıdır. Her iki tarafın desteklediği özelliklere göre en iyi aktarım yöntemini — WebSockets, sunucu tarafından gönderilen olaylar veya uzun yoklama — otomatik olarak seçer.
SignalR'ı Kurma
Hizmetlere SignalR ekleyin ve bir hub uç noktası eşleyin. Hub, istemci bağlantılarını ve yöntem çağrılarını yöneten bir sınıftır.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();Hub Oluşturma
Hub sınıfından türetin. Hub yöntemleri istemciler tarafından çağrılır. Bağlam özelliği bağlantı bilgilerini sağlar, Clients ise geri ileti göndermenize olanak tanır.
using Microsoft.AspNetCore.SignalR;
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
// Broadcast to ALL connected clients
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
public override async Task OnConnectedAsync()
{
await Clients.Caller.SendAsync("Welcome",
$"Connected as {Context.ConnectionId}");
await base.OnConnectedAsync();
}
}JavaScript İstemcisi
Resmî SignalR JavaScript istemcisi bir bağlantı oluşturur, olay işleyicilerini kaydeder ve bağlantıyı başlatır. Hub'da tanımlanan yöntemler JavaScript'ten çağrılabilir.
// npm install @microsoft/signalr
import * as signalR from "@microsoft/signalr";
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hubs/chat")
.withAutomaticReconnect()
.build();
connection.on("ReceiveMessage", (user, message) => {
console.log(`${user}: ${message}`);
});
await connection.start();
await connection.invoke("SendMessage", "Alice", "Hello!");.NET SignalR İstemcisi
.NET istemcisi de aynı şekilde çalışır — hizmetler arası gerçek zamanlı iletişim veya masaüstü ve mobil uygulamalar için kullanışlıdır.
// dotnet add package Microsoft.AspNetCore.SignalR.Client
var connection = new HubConnectionBuilder()
.WithUrl("https://myapp.com/hubs/chat")
.WithAutomaticReconnect()
.Build();
connection.On<string, string>("ReceiveMessage", (user, msg) =>
Console.WriteLine($"{user}: {msg}"));
await connection.StartAsync();
await connection.InvokeAsync("SendMessage", "Bot", "Connected!");Belirli İstemcilere Gönderme
Clients özelliği, belirli bağlantıları, çağrıyı yapanları veya belirtilenler dışındaki tüm bağlı istemcileri hedefleyecek yöntemlere sahiptir.
// To the caller only
await Clients.Caller.SendAsync("YouSaid", message);
// To a specific connection
await Clients.Client(connectionId).SendAsync("PrivateMsg", msg);
// To all except caller
await Clients.Others.SendAsync("ReceiveMessage", user, message);
// To multiple specific connections
await Clients.Clients(new[] { id1, id2 })
.SendAsync("DirectMsg", msg);Hub Bağlamı: Hub Dışından Gönderme
Sunucu tarafından başlatılan gönderimler için gerekli olan, hub sınıfının dışından ileti göndermek amacıyla IHubContext<T> öğesini hizmetlere veya arka plan çalışanlarına ekleyin.
public class NotificationService
{
private readonly IHubContext<ChatHub> _hub;
public NotificationService(IHubContext<ChatHub> hub) => _hub = hub;
public async Task BroadcastAlertAsync(string alert)
{
// Send to all clients from a background service
await _hub.Clients.All.SendAsync("SystemAlert", alert);
}
}Bağlantı Yaşam Döngüsü Olayları
Bağlantıları izlemek, durumu korumak veya kaynakları temizlemek için OnConnectedAsync ve OnDisconnectedAsync yöntemlerini geçersiz kılın.
public override async Task OnConnectedAsync()
{
_connections.TryAdd(Context.ConnectionId, GetUserName());
await Clients.All.SendAsync("UserJoined", GetUserName());
await base.OnConnectedAsync();
}
public override async Task OnDisconnectedAsync(Exception? ex)
{
_connections.TryRemove(Context.ConnectionId, out var user);
await Clients.All.SendAsync("UserLeft", user);
await base.OnDisconnectedAsync(ex);
}
private string GetUserName() =>
Context.User?.Identity?.Name ?? Context.ConnectionId;Otomatik Yeniden Bağlanma
Geçici bağlantı kopmalarını düzgün biçimde ele almak için istemcide otomatik yeniden bağlanmayı etkinleştirin. Yeniden deneme gecikmelerini özelleştirebilirsiniz.
// JavaScript client
const conn = new signalR.HubConnectionBuilder()
.withUrl("/hubs/chat")
.withAutomaticReconnect([0, 2000, 5000, 10000, 30000]) // retry delays in ms
.build();
conn.onreconnecting(err => console.warn("Reconnecting...", err));
conn.onreconnected(id => console.log("Reconnected:", id));
conn.onclose(err => console.error("Disconnected:", err));SignalR ile Kimlik Doğrulama
SignalR, ASP.NET Core kimlik doğrulama ara yazılımına uyar. Hub sınıfına [Authorize] ekleyin veya sorgu dizesi token'larını destekleyen JWT handler kullanın (WebSocket kimlik doğrulaması için gereklidir).
[Authorize]
public class PrivateHub : Hub
{
public Task SendMessage(string msg)
{
var user = Context.User!.Identity!.Name;
return Clients.All.SendAsync("Msg", user, msg);
}
}
// JWT via query string (WebSocket requirement):
builder.Services.AddAuthentication().AddJwtBearer(opt =>
{
opt.Events = new JwtBearerEvents
{
OnMessageReceived = ctx =>
{
var token = ctx.Request.Query["access_token"];
if (!string.IsNullOrEmpty(token))
ctx.Token = token;
return Task.CompletedTask;
}
};
});Hızlı Kontrol
Bir arka plan hizmetinden (hub sınıfının dışından) nasıl SignalR iletisi gönderirsiniz?
Özet: SignalR Hub'ları ve Bağlantıları
Temel çıkarımlar:
- SignalR en iyi aktarım yöntemini (WebSockets, SSE, uzun yoklama) otomatik olarak seçer
- Hub yöntemleri istemciler tarafından çağrılabilir;
Clients.*belirli alıcıları hedefler - Hub'ın dışından ileti göndermek için
IHubContext<T>ekleyin - Yaşam döngüsü yönetimi için
OnConnectedAsync/OnDisconnectedAsyncyöntemlerini geçersiz kılın - Dayanıklı istemci bağlantıları için
withAutomaticReconnect()kullanın - WebSocket bağlantıları için sorgu dizesi üzerinden JWT kimlik doğrulaması gerekir
Sıkça Sorulan Sorular
“SignalR Hub'ları ve Bağlantılar” dersi ücretsiz mi?
Evet — “SignalR Hub'ları ve Bağlantılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.
“SignalR Hub'ları ve Bağlantılar” dersinde ne öğreneceğim?
Bir SignalR hub'ı oluşturun, ASP.NET Core'da eşleyin ve JavaScript ile .NET istemcilerinden WebSocket bağlantıları kurun. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C# Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“SignalR Hub'ları ve Bağlantılar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- SignalR Hub'ları ve Bağlantılar
- Gruplar, Kullanıcılar ve Bağlantı Yönetimi
- Güçlü Türlendirilmiş Hub'lar
- Redis Backplane ile Ölçekleme