SignalR-hubs og forbindelser
Opret en SignalR-hub, map den i ASP.NET Core, og opret WebSocket-forbindelser fra JavaScript- og .NET-klienter.
SignalR-hubs og forbindelser er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad er SignalR?
SignalR er et ASP.NET Core-bibliotek, der tilføjer tovejskommunikation i realtid mellem serveren og klienterne. Det vælger automatisk den bedste transport — WebSockets, Server-Sent Events eller Long Polling — ud fra, hvad begge sider understøtter.
Opsætning af SignalR
Føj SignalR til tjenesterne, og tilknyt et hub-slutpunkt. En hub er en klasse, der håndterer klientforbindelser og metodekald.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();Oprettelse af en hub
Nedarv fra Hub. Hub-metoder kaldes af klienter. Egenskaben Context indeholder forbindelsesoplysninger, og Clients lader dig sende meddelelser tilbage.
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-klient
Den officielle SignalR-JavaScript-klient opretter en forbindelse, registrerer hændelsesbehandlere og starter forbindelsen. Metoder, der er defineret på hubben, kan kaldes fra JavaScript.
// 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-klient
.NET-klienten fungerer på samme måde — nyttig til kommunikation i realtid mellem tjenester eller til computer- og mobilapps.
// 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!");Afsendelse til bestemte klienter
Egenskaben Clients indeholder metoder til at målrette bestemte forbindelser, kaldere eller alle tilsluttede klienter undtagen de angivne.
// 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-kontekst: afsendelse uden for hubben
Indsprøjt IHubContext<T> i tjenester eller baggrundsarbejdere for at sende meddelelser fra uden for hubklassen — afgørende for serverinitierede meddelelser.
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);
}
}Hændelser i forbindelsens livscyklus
Tilsidesæt OnConnectedAsync og OnDisconnectedAsync for at holde styr på forbindelser, vedligeholde tilstand eller frigive ressourcer.
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;Automatisk genforbindelse
Aktivér automatisk genforbindelse på klienten for at håndtere midlertidige afbrydelser på en robust måde. Du kan tilpasse forsinkelserne mellem nye forsøg.
// 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));Godkendelse med SignalR
SignalR følger ASP.NET Core-godkendelsesmiddleware. Føj [Authorize] til hubklassen, eller brug JWT-handleren, der understøtter tokens i forespørgselsstrengen (nødvendigt til WebSocket-godkendelse).
[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;
}
};
});Hurtigt tjek
Hvordan sender du en SignalR-meddelelse fra en baggrundstjeneste (uden for hubklassen)?
Opsummering: SignalR-hubs og -forbindelser
Vigtigste pointer:
- SignalR vælger automatisk den bedste transport (WebSockets, SSE, Long Polling)
- Hub-metoder kan kaldes af klienter;
Clients.*målretter bestemte modtagere - Indsprøjt
IHubContext<T>for at sende meddelelser fra uden for hubben - Tilsidesæt
OnConnectedAsync/OnDisconnectedAsyncfor at styre livscyklussen - Brug
withAutomaticReconnect()til robuste klientforbindelser - JWT-godkendelse via forespørgselsstrengen er påkrævet for WebSocket-forbindelser
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “SignalR-hubs og forbindelser” gratis?
Ja — hele teksten til “SignalR-hubs og forbindelser” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “SignalR-hubs og forbindelser”?
Opret en SignalR-hub, map den i ASP.NET Core, og opret WebSocket-forbindelser fra JavaScript- og .NET-klienter. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “SignalR-hubs og forbindelser”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- SignalR-hubs og forbindelser
- Grupper, brugere og forbindelseshåndtering
- Stærkt typede hubs
- Skalering med Redis-backplane