C# Academy · Lektion

SignalR-hubs og forbindelser

Opret en SignalR-hub, map den i ASP.NET Core, og opret WebSocket-forbindelser fra JavaScript- og .NET-klienter.

Lektion 1 af 412 trin

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/OnDisconnectedAsync for at styre livscyklussen
  • Brug withAutomaticReconnect() til robuste klientforbindelser
  • JWT-godkendelse via forespørgselsstrengen er påkrævet for WebSocket-forbindelser
Gratis at komme i gang

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

  1. SignalR-hubs og forbindelser
  2. Grupper, brugere og forbindelseshåndtering
  3. Stærkt typede hubs
  4. Skalering med Redis-backplane
← Tilbage til C# Academy