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/OnDisconnectedAsyncfü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
- SignalR-Hubs und Verbindungen
- Gruppen, Benutzer und Verbindungsverwaltung
- Typsichere Hubs
- Skalierung mit Redis-Backplane