Huby i połączenia SignalR
Utwórz hub SignalR, zmapuj go w ASP.NET Core i nawiązuj połączenia WebSocket z klientów JavaScript i .NET.
Huby i połączenia SignalR to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.
Czym jest SignalR
SignalR to biblioteka ASP.NET Core dodająca komunikację w czasie rzeczywistym i dwukierunkową między serwerem a klientami. Automatycznie wybiera najlepszy transport — WebSockets, Server-Sent Events lub Long Polling — na podstawie możliwości obu stron.
Konfigurowanie SignalR
Dodaj SignalR do usług i zmapuj punkt końcowy huba. Hub to klasa obsługująca połączenia klientów i wywołania metod.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();Tworzenie huba
Dziedzicz po Hub. Metody huba są wywoływane przez klientów. Właściwość Context udostępnia informacje o połączeniu, a Clients umożliwia wysyłanie wiadomości zwrotnych.
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();
}
}Klient JavaScript
Oficjalny klient SignalR dla JavaScriptu tworzy połączenie, rejestruje handlery zdarzeń i uruchamia połączenie. Metody zdefiniowane na hubie można wywoływać z JavaScriptu.
// 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-owy klient SignalR
Klient .NET działa tak samo — przydaje się do komunikacji w czasie rzeczywistym między usługami oraz w aplikacjach desktopowych i mobilnych.
// 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!");Wysyłanie do konkretnych klientów
Właściwość Clients ma metody umożliwiające kierowanie wiadomości do konkretnych połączeń, wywołujących lub wszystkich połączonych klientów z wyjątkiem wskazanych.
// 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);Kontekst huba: wysyłanie spoza huba
Wstrzyknij IHubContext<T> do usług lub procesów działających w tle, aby wysyłać wiadomości spoza klasy huba — jest to niezbędne do wypychania danych inicjowanego przez serwer.
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);
}
}Zdarzenia cyklu życia połączenia
Przesłoń OnConnectedAsync i OnDisconnectedAsync, aby śledzić połączenia, utrzymywać stan lub zwalniać zasoby.
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;Automatyczne ponowne łączenie
Włącz automatyczne ponowne łączenie po stronie klienta, aby prawidłowo obsługiwać przejściowe rozłączenia. Możesz dostosować opóźnienia ponawiania prób.
// 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));Uwierzytelnianie za pomocą SignalR
SignalR respektuje middleware uwierzytelniania ASP.NET Core. Dodaj [Authorize] do klasy huba lub użyj handlera JWT obsługującego tokeny w parametrze query string (wymagane do uwierzytelniania WebSocket).
[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;
}
};
});Szybkie sprawdzenie
Jak wysłać wiadomość SignalR z usługi działającej w tle (spoza klasy huba)?
Podsumowanie: huby i połączenia SignalR
Najważniejsze informacje:
- SignalR automatycznie wybiera najlepszy transport (WebSockets, SSE, Long Polling)
- Metody huba mogą być wywoływane przez klientów;
Clients.*kieruje wiadomości do konkretnych odbiorców - Wstrzyknij
IHubContext<T>, aby wysyłać wiadomości spoza huba - Przesłaniaj
OnConnectedAsync/OnDisconnectedAsync, aby zarządzać cyklem życia - Używaj
withAutomaticReconnect()do uzyskiwania odpornych na zakłócenia połączeń klienta - Uwierzytelnianie JWT za pomocą query string jest wymagane dla połączeń WebSocket
Często zadawane pytania
Czy lekcja „Huby i połączenia SignalR” jest bezpłatna?
Tak — pełny tekst „Huby i połączenia SignalR” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Huby i połączenia SignalR”?
Utwórz hub SignalR, zmapuj go w ASP.NET Core i nawiązuj połączenia WebSocket z klientów JavaScript i .NET. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C# Academy?
Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Huby i połączenia SignalR”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?
Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Huby i połączenia SignalR
- Grupy, użytkownicy i zarządzanie połączeniami
- Silnie typowane huby
- Skalowanie z Redis Backplane