0Pricing
C# Academy · Lektion

SignalR-Hubs und Verbindungen

Erstellen Sie einen SignalR-Hub, binden Sie ihn in ASP.NET Core ein und stellen Sie WebSocket-Verbindungen von JavaScript- und .NET-Clients her.

SignalR-Hubs und Verbindungen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist SignalR?

SignalR ist eine ASP.NET Core-Bibliothek, die Echtzeitkommunikation in beide Richtungen zwischen Servern und Clients ermöglicht. Sie wählt automatisch den besten Transport – WebSockets, Server-Sent Events oder Long Polling – abhängig davon, was beide Seiten unterstützen.

SignalR einrichten

Fügen Sie SignalR zu den Diensten hinzu und ordnen Sie einen Hub-Endpunkt zu. Ein Hub ist eine Klasse, die Clientverbindungen und Methodenaufrufe verarbeitet.

builder.Services.AddSignalR();

var app = builder.Build();

app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");

app.Run();

Einen Hub erstellen

Leiten Sie von Hub ab. Hub-Methoden werden von Clients aufgerufen. Die Eigenschaft Context stellt Verbindungsinformationen bereit, und mit Clients können Sie Nachrichten zurücksenden.

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-Client

Der offizielle SignalR-JavaScript-Client baut eine Verbindung auf, registriert Ereignishandler und startet die Verbindung. Im Hub definierte Methoden können aus JavaScript aufgerufen werden.

// 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-Client

Der .NET-Client funktioniert auf dieselbe Weise – nützlich für Echtzeitkommunikation zwischen Diensten oder für Desktop- und mobile Apps.

// 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!");

An bestimmte Clients senden

Die Eigenschaft Clients stellt Methoden bereit, mit denen Sie bestimmte Verbindungen, Aufrufer oder alle verbundenen Clients außer angegebenen Clients ansprechen können.

// 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-Kontext: Außerhalb des Hubs senden

Fügen Sie IHubContext<T> in Dienste oder Hintergrundprozesse ein, um Nachrichten außerhalb der Hub-Klasse zu senden – unverzichtbar für vom Server initiierte Push-Nachrichten.

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);
    }
}

Ereignisse im Verbindungslebenszyklus

Überschreiben Sie OnConnectedAsync und OnDisconnectedAsync, um Verbindungen zu verfolgen, den Zustand zu verwalten oder Ressourcen freizugeben.

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;

Automatische Wiederverbindung

Aktivieren Sie auf dem Client die automatische Wiederverbindung, um vorübergehende Verbindungsabbrüche ordnungsgemäß zu behandeln. Sie können die Wiederholungsverzögerungen anpassen.

// 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));

Authentifizierung mit SignalR

SignalR berücksichtigt die ASP.NET Core-Authentifizierungsmiddleware. Fügen Sie [Authorize] zur Hub-Klasse hinzu oder verwenden Sie den JWT-Handler, der Token in der Query-Zeichenkette unterstützt (für die WebSocket-Authentifizierung erforderlich).

[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;
        }
    };
});

Kurze Prüfung

Wie senden Sie eine SignalR-Nachricht aus einem Hintergrunddienst, also außerhalb der Hub-Klasse?

Zusammenfassung: SignalR-Hubs und Verbindungen

Wichtige Erkenntnisse:

  • SignalR wählt automatisch den besten Transport (WebSockets, SSE, Long Polling)
  • Hub-Methoden können von Clients aufgerufen werden; Clients.* bestimmt die Empfänger
  • Fügen Sie IHubContext<T> ein, um Nachrichten außerhalb des Hubs zu senden
  • Überschreiben Sie OnConnectedAsync/OnDisconnectedAsync für die Verwaltung des Verbindungslebenszyklus
  • Verwenden Sie withAutomaticReconnect() für robuste Clientverbindungen
  • JWT-Authentifizierung über die Query-Zeichenkette ist für WebSocket-Verbindungen erforderlich

Häufig gestellte Fragen

Ist die Lektion „SignalR-Hubs und Verbindungen“ kostenlos?

Ja — der vollständige Text von „SignalR-Hubs und Verbindungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „SignalR-Hubs und Verbindungen“?

Erstellen Sie einen SignalR-Hub, binden Sie ihn in ASP.NET Core ein und stellen Sie WebSocket-Verbindungen von JavaScript- und .NET-Clients her. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C# Academy zu starten?

Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „SignalR-Hubs und Verbindungen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?

Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. SignalR-Hubs und Verbindungen
  2. Gruppen, Benutzer und Verbindungsverwaltung
  3. Typsichere Hubs
  4. Skalierung mit Redis-Backplane
← Zurück zu C# Academy