0Pricing
C# Academy · Lekcja

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

  1. Huby i połączenia SignalR
  2. Grupy, użytkownicy i zarządzanie połączeniami
  3. Silnie typowane huby
  4. Skalowanie z Redis Backplane
← Powrót do C# Academy