SignalR-hubit ja yhteydet
Luokaa SignalR-hubi, kartoittakaa se ASP.NET Coressa ja muodostakaa WebSocket-yhteyksiä JavaScript- ja .NET-asiakkaista.
SignalR-hubit ja yhteydet on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mikä SignalR on
SignalR on ASP.NET Coren kirjasto, joka lisää reaaliaikaisen kaksisuuntaisen viestinnän palvelimen ja asiakkaiden välille. Se valitsee automaattisesti parhaan siirtotavan — WebSockets, Server-Sent Events tai Long Polling — sen perusteella, mitä molemmat osapuolet tukevat.
SignalR:n määrittäminen
Lisätkää SignalR palveluihin ja määrittäkää hub-päätepiste. Hub on luokka, joka käsittelee asiakasyhteyksiä ja metodikutsuja.
builder.Services.AddSignalR();
var app = builder.Build();
app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");
app.Run();Hubin luominen
Perikää Hub-luokka. Asiakkaat kutsuvat hubin metodeja. Context-ominaisuus tarjoaa yhteystiedot, ja Clients-ominaisuuden avulla voitte lähettää viestejä takaisin.
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-asiakas
Virallinen SignalR JavaScript -asiakas rakentaa yhteyden, rekisteröi tapahtumakäsittelijät ja käynnistää yhteyden. Hubissa määritettyjä metodeja voi kutsua JavaScriptistä.
// 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 -asiakas
.NET-asiakas toimii samalla tavalla — se sopii palveluiden väliseen reaaliaikaiseen viestintään tai työpöytä- ja mobiilisovelluksiin.
// 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!");Viestien lähettäminen tietyille asiakkaille
Clients-ominaisuudessa on menetelmiä, joilla viestit voidaan kohdistaa tiettyihin yhteyksiin, kutsun lähettäjille tai kaikille yhdistetyille asiakkaille tiettyjä lukuun ottamatta.
// 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-konteksti: lähettäminen hubin ulkopuolelta
Injektoikaa IHubContext<T> palveluihin tai taustatyöntekijöihin lähettääksenne viestejä hub-luokan ulkopuolelta — tämä on välttämätöntä palvelimen käynnistämille push-viesteille.
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);
}
}Yhteyden elinkaaritapahtumat
Ylikirjoittakaa OnConnectedAsync- ja OnDisconnectedAsync-metodit seurataksenne yhteyksiä, ylläpitääksenne tilaa tai vapauttaaksenne resursseja.
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;Automaattinen uudelleenyhdistäminen
Ottakaa automaattinen uudelleenyhdistäminen käyttöön asiakkaalla käsitelläksenne tilapäiset yhteyskatkokset hallitusti. Voitte mukauttaa uudelleenyritysten viiveitä.
// 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));Todennus SignalR:ssä
SignalR noudattaa ASP.NET Coren todennusmiddlewareä. Lisätkää [Authorize] hub-luokkaan tai käyttäkää JWT-käsittelijää, joka tukee kyselymerkkijonotunnuksia (niitä tarvitaan WebSocket-todennukseen).
[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;
}
};
});Pikatarkistus
Miten SignalR-viesti lähetetään taustapalvelusta (hub-luokan ulkopuolelta)?
Kertaus: SignalR-hubit ja yhteydet
Keskeiset opit:
- SignalR valitsee parhaan siirtotavan automaattisesti (WebSockets, SSE, Long Polling)
- Asiakkaat voivat kutsua hub-metodeja;
Clients.*kohdistaa viestit tiettyihin vastaanottajiin - Injektoikaa
IHubContext<T>lähettääksenne viestejä hubin ulkopuolelta - Ylikirjoittakaa
OnConnectedAsync/OnDisconnectedAsyncyhteyksien elinkaaren hallintaa varten - Käyttäkää
withAutomaticReconnect()-metodia vikasietoisten asiakasyhteyksien luomiseen - JWT-todennus kyselymerkkijonon kautta vaaditaan WebSocket-yhteyksissä
Opi C# tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 93
- Oppitunnit
- 346
Usein kysytyt kysymykset
Onko oppitunti ”SignalR-hubit ja yhteydet” ilmainen?
Kyllä – oppitunnin ”SignalR-hubit ja yhteydet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”SignalR-hubit ja yhteydet”?
Luokaa SignalR-hubi, kartoittakaa se ASP.NET Coressa ja muodostakaa WebSocket-yhteyksiä JavaScript- ja .NET-asiakkaista. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”SignalR-hubit ja yhteydet”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?
Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- SignalR-hubit ja yhteydet
- Ryhmät, käyttäjät ja yhteyksien hallinta
- Vahvasti tyypitetyt hubit
- Skaalaus Redis-taustapalvelulla