C# Academy · Oppitunti

SignalR-hubit ja yhteydet

Luokaa SignalR-hubi, kartoittakaa se ASP.NET Coressa ja muodostakaa WebSocket-yhteyksiä JavaScript- ja .NET-asiakkaista.

Oppitunti 1/412 vaihetta

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/OnDisconnectedAsync yhteyksien elinkaaren hallintaa varten
  • Käyttäkää withAutomaticReconnect()-metodia vikasietoisten asiakasyhteyksien luomiseen
  • JWT-todennus kyselymerkkijonon kautta vaaditaan WebSocket-yhteyksissä
Aloita maksutta

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

  1. SignalR-hubit ja yhteydet
  2. Ryhmät, käyttäjät ja yhteyksien hallinta
  3. Vahvasti tyypitetyt hubit
  4. Skaalaus Redis-taustapalvelulla
← Takaisin: C# Academy