Groepen, gebruikers en verbindingsbeheer
Beheer groepen, richt u op specifieke gebruikers of verbindingen en verwerk gebeurtenissen in de levenscyclus van verbinden en verbreken.
Groepen, gebruikers en verbindingsbeheer is een gratis C# Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject C# Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus C# Academy bevat in totaal 4 lessen.
Waarom groepen en gebruikers?
In echte toepassingen wil je zelden naar ALLE clients uitzenden. Met de groepen van SignalR kun je specifieke deelverzamelingen van verbindingen selecteren (bijvoorbeeld een chatruimte), en met gebruikers kun je alle verbindingen van een specifieke geauthenticeerde gebruiker aanspreken.
Verbindingen aan groepen toevoegen
Roep Groups.AddToGroupAsync() aan met de verbindings-ID en een groepsnaam. Een verbinding kan tegelijkertijd tot meerdere groepen behoren.
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);
}
}Naar groepen verzenden
Gebruik Clients.Group(name) om naar alle verbindingen in een groep te verzenden. Andere opties voor doelbepaling zijn GroupExcept en Groups (meerdere tegelijk).
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);
}Op gebruikers gebaseerd richten
Wanneer een gebruiker meerdere browsertabbladen of apparaten open heeft, heeft die gebruiker meerdere verbindingen. Clients.User(userId) verzendt tegelijk naar ALLE verbindingen van die gebruiker.
// 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");Aangepaste aanbieder voor gebruikers-ID's
SignalR gebruikt standaard de claim NameIdentifier als gebruikers-ID. Implementeer IUserIdProvider om een andere claim of aangepaste logica te gebruiken.
public class EmailUserIdProvider : IUserIdProvider
{
public string? GetUserId(HubConnectionContext connection)
{
return connection.User?.FindFirst(ClaimTypes.Email)?.Value;
}
}
// Register:
builder.Services.AddSingleton<IUserIdProvider, EmailUserIdProvider>();Verbindingsstatus bijhouden
SignalR bewaart geen verbindingsstatus tussen verbroken verbindingen. Houd je eigen toewijzing van gebruikers-ID's aan verbindings-ID's bij in een threadveilige woordenlijst (één server) of Redis (meerdere servers).
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>();
}Groepen automatisch beheren in OnConnected/OnDisconnected
Een gangbaar patroon is om geauthenticeerde gebruikers in OnConnectedAsync automatisch aan hun persoonlijke groep toe te voegen, zodat je ze op groepsnaam kunt selecteren zonder aangepaste registratie.
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);Verzenden vanuit achtergrondservices met groepen
Met IHubContext kun je vanuit achtergrondservices berichten naar groepen en gebruikers sturen — perfect voor asynchrone meldingen die door gebeurtenissen in je systeem worden gestart.
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);
}
}Persistentie van groepslidmaatschap
Groepslidmaatschap wordt niet bewaard — als de server opnieuw wordt gestart of een Redis-backplane zijn status verliest, zijn de groepen leeg. Laat clients bij het opnieuw verbinden opnieuw lid worden van groepen met de clientgebeurtenis 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);
}
});Aanwezigheid: online/offline detecteren
Houd de onlinestatus bij door per gebruiker het aantal verbindingen te tellen in OnConnected/OnDisconnected en aanwezigheidsgebeurtenissen uit te zenden naar relevante groepen.
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);
}Korte controle
Wat doet Clients.User(userId) als een gebruiker drie browsertabbladen geopend heeft?
Samenvatting: groepen, gebruikers en verbindingsbeheer
Belangrijkste punten:
Groups.AddToGroupAsync/RemoveFromGroupAsync: beheer groepslidmaatschapClients.Group(name): stuur naar een deelverzameling van verbindingenClients.User(userId): stuur naar alle verbindingen van een gebruiker- Implementeer
IUserIdProvidervoor aangepaste claims voor gebruikers-ID's - Groepen worden niet bewaard — word bij het opnieuw verbinden opnieuw lid
- Houd verbindingstellingen bij in ConcurrentDictionary om aanwezigheid te detecteren
Leer C# met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 93
- Lessen
- 346
Veelgestelde vragen
Is de les “Groepen, gebruikers en verbindingsbeheer” gratis?
Ja — de volledige tekst van “Groepen, gebruikers en verbindingsbeheer” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus C# Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus C# Academy bevat in totaal 4 lessen.
Wat leer ik in “Groepen, gebruikers en verbindingsbeheer”?
Beheer groepen, richt u op specifieke gebruikers of verbindingen en verwerk gebeurtenissen in de levenscyclus van verbinden en verbreken. Je oefent met C# Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met C# Academy te beginnen?
Ervaring vooraf is niet nodig. C# Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Groepen, gebruikers en verbindingsbeheer”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over C# Academy?
Ja. Elke les over C# Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- SignalR-hubs en verbindingen
- Groepen, gebruikers en verbindingsbeheer
- Sterk getypeerde hubs
- Schalen met Redis Backplane