C# Academy · leksjon

Grupper, brukere og tilkoblingshåndtering

Administrer grupper, målrett bestemte brukere eller tilkoblinger, og håndter livssyklushendelser for tilkobling og frakobling.

Leksjon 2 av 412 trinn

Grupper, brukere og tilkoblingshåndtering er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hvorfor grupper og brukere?

I virkelige applikasjoner vil du sjelden kringkaste til ALLE klienter. SignalRs grupper lar deg målrette delmengder av tilkoblinger (f.eks. et chatterom), og brukere lar deg adressere alle tilkoblinger som tilhører en bestemt autentisert bruker.

Legge til tilkoblinger i grupper

Kall Groups.AddToGroupAsync() med tilkoblings-ID-en og et gruppenavn. En tilkobling kan tilhøre flere grupper samtidig.

public class ChatHub : Hub
{
    public async Task JoinRoom(string roomName)
    {
        await Groups.AddToGroupAsync(Context.ConnectionId, roomName);
        await Clients.Group(roomName)
                     .SendAsync("UserJoined", Context.User!.Identity!.Name);
    }

    public async Task LeaveRoom(string roomName)
    {
        await Groups.RemoveFromGroupAsync(Context.ConnectionId, roomName);
        await Clients.Group(roomName)
                     .SendAsync("UserLeft", Context.User!.Identity!.Name);
    }
}

Sende til grupper

Bruk Clients.Group(name) for å sende til alle tilkoblinger i en gruppe. Andre målrettingsalternativer omfatter GroupExcept og Groups (flere samtidig).

public async Task SendToRoom(string roomName, string message)
{
    var sender = Context.User!.Identity!.Name;

    // Everyone in the room
    await Clients.Group(roomName)
                 .SendAsync("ReceiveMessage", sender, message);

    // Everyone in the room except the sender
    await Clients.GroupExcept(roomName, Context.ConnectionId)
                 .SendAsync("ReceiveMessage", sender, message);
}

Brukerbasert målretting

Når en bruker har flere åpne nettleserfaner eller enheter, har brukeren flere tilkoblinger. Clients.User(userId) sender til ALLE tilkoblinger for denne brukeren samtidig.

// Send to all connections of user with ID "user-123"
await Clients.User("user-123")
             .SendAsync("Notification", "Your order has shipped!");

// SignalR uses the NameIdentifier claim by default.
// Context.UserIdentifier returns the current user's ID.
var myId = Context.UserIdentifier;
await Clients.User(myId!).SendAsync("Ack", "Server received your message");

Egendefinert leverandør for bruker-ID

Som standard bruker SignalR NameIdentifier-claimen som bruker-ID. Implementer IUserIdProvider for å bruke en annen claim eller egendefinert logikk.

public class EmailUserIdProvider : IUserIdProvider
{
    public string? GetUserId(HubConnectionContext connection)
    {
        return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
    }
}

// Register:
builder.Services.AddSingleton<IUserIdProvider, EmailUserIdProvider>();

Spore tilkoblingstilstand

SignalR lagrer ikke tilkoblingstilstand mellom frakoblinger. Spor din egen tilordning fra bruker-ID-er til tilkoblings-ID-er i en trådsikker ordbok (én server) eller Redis (flere servere).

public class ConnectionTracker
{
    private readonly ConcurrentDictionary<string, HashSet<string>> _userConnections
        = new();

    public void AddConnection(string userId, string connectionId)
        => _userConnections.GetOrAdd(userId, _ => new()).Add(connectionId);

    public void RemoveConnection(string userId, string connectionId)
    {
        if (_userConnections.TryGetValue(userId, out var conns))
        {
            conns.Remove(connectionId);
            if (conns.Count == 0) _userConnections.TryRemove(userId, out _);
        }
    }

    public IEnumerable<string> GetConnections(string userId)
        => _userConnections.TryGetValue(userId, out var c) ? c : Enumerable.Empty<string>();
}

Automatisk håndtering av grupper i OnConnected/OnDisconnected

Et vanlig mønster er å legge autentiserte brukere automatisk til sin personlige gruppe i OnConnectedAsync, slik at du kan målrette dem med gruppenavnet uten egendefinert sporing.

public override async Task OnConnectedAsync()
{
    // Add to a personal group named by user ID
    var userId = Context.UserIdentifier;
    if (userId is not null)
        await Groups.AddToGroupAsync(Context.ConnectionId, userId);
    await base.OnConnectedAsync();
}

// Now send to a user by their personal group:
await _hub.Clients.Group(userId)
           .SendAsync("Update", payload);

Sende fra bakgrunnstjenester med grupper

Med IHubContext kan du målrette grupper og brukere fra bakgrunnstjenester – perfekt for asynkrone varsler som utløses av hendelser i systemet.

public class OrderShippedHandler : INotificationHandler<OrderShipped>
{
    private readonly IHubContext<OrderHub> _hub;
    public OrderShippedHandler(IHubContext<OrderHub> hub) => _hub = hub;

    public async Task Handle(OrderShipped notification, CancellationToken ct)
    {
        // Push to the customer's personal group
        await _hub.Clients.Group(notification.CustomerId.ToString())
                  .SendAsync("OrderShipped",
                      new { notification.OrderId, notification.TrackingNumber },
                      ct);
    }
}

Lagring av gruppemedlemskap

Gruppemedlemskap lagres ikke — hvis serveren starter på nytt, eller et Redis-backplane mister tilstanden, er gruppene tomme. Meld klientene inn i gruppene på nytt ved gjenopprettet tilkobling ved hjelp av klienthendelsen onreconnected.

// JavaScript client: re-join groups after reconnect
connection.onreconnected(async connectionId => {
    console.log(`Reconnected as ${connectionId}`);
    // Re-join previously joined rooms
    for (const room of joinedRooms) {
        await connection.invoke("JoinRoom", room);
    }
});

Tilstedeværelse: registrering av online/offline-status

Følg med på online-status ved å telle tilkoblinger per bruker i OnConnected/OnDisconnected og kringkaste tilstedeværelseshendelser til relevante grupper.

public override async Task OnConnectedAsync()
{
    var userId = Context.UserIdentifier!;
    var count = _tracker.AddConnection(userId, Context.ConnectionId);
    if (count == 1) // first connection for this user
        await Clients.Others.SendAsync("UserOnline", userId);
    await base.OnConnectedAsync();
}

public override async Task OnDisconnectedAsync(Exception? ex)
{
    var userId = Context.UserIdentifier!;
    var count = _tracker.RemoveConnection(userId, Context.ConnectionId);
    if (count == 0) // no more connections
        await Clients.Others.SendAsync("UserOffline", userId);
    await base.OnDisconnectedAsync(ex);
}

Rask sjekk

Hva gjør Clients.User(userId) når en bruker har tre åpne nettleserfaner?

Oppsummering: grupper, brukere og tilkoblingsadministrasjon

Viktigste punkter:

  • Groups.AddToGroupAsync/RemoveFromGroupAsync: administrerer gruppemedlemskap
  • Clients.Group(name): sender til et utvalg tilkoblinger
  • Clients.User(userId): sender til alle tilkoblingene til en bruker
  • Implementer IUserIdProvider for egendefinerte bruker-ID-claims
  • Gruppemedlemskap lagres ikke — meld klienten inn på nytt ved gjenopprettet tilkobling
  • Følg med på antallet tilkoblinger i ConcurrentDictionary for å registrere tilstedeværelse
Gratis å komme i gang

Lær deg C# med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
93
Leksjoner
346

Ofte stilte spørsmål

Er leksjonen «Grupper, brukere og tilkoblingshåndtering» gratis?

Ja – hele teksten i «Grupper, brukere og tilkoblingshåndtering» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Grupper, brukere og tilkoblingshåndtering»?

Administrer grupper, målrett bestemte brukere eller tilkoblinger, og håndter livssyklushendelser for tilkobling og frakobling. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med C# Academy?

Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Grupper, brukere og tilkoblingshåndtering»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?

Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. SignalR-huber og tilkoblinger
  2. Grupper, brukere og tilkoblingshåndtering
  3. Sterkt typede huber
  4. Skalering med Redis-backplane
← Tilbake til C# Academy