Grupper, brukere og tilkoblingshåndtering
Administrer grupper, målrett bestemte brukere eller tilkoblinger, og håndter livssyklushendelser for tilkobling og frakobling.
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 gruppemedlemskapClients.Group(name): sender til et utvalg tilkoblingerClients.User(userId): sender til alle tilkoblingene til en bruker- Implementer
IUserIdProviderfor 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
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
- SignalR-huber og tilkoblinger
- Grupper, brukere og tilkoblingshåndtering
- Sterkt typede huber
- Skalering med Redis-backplane