C# Academy · Leçon

Hubs et connexions SignalR

Créez un hub SignalR, mappez-le dans ASP.NET Core et établissez des connexions WebSocket depuis des clients JavaScript et .NET.

Leçon 1 sur 412 étapes

Hubs et connexions SignalR est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.

Qu’est-ce que SignalR ?

SignalR est une bibliothèque ASP.NET Core qui ajoute une communication bidirectionnelle en temps réel entre le serveur et les clients. Elle choisit automatiquement le meilleur transport — WebSockets, événements envoyés par le serveur ou interrogation longue — selon ce que les deux parties prennent en charge.

Configurer SignalR

Ajoutez SignalR aux services et mappez un point de terminaison de hub. Un hub est une classe qui gère les connexions client et les appels de méthodes.

builder.Services.AddSignalR();

var app = builder.Build();

app.UseCors("AllowAll");
app.MapHub<ChatHub>("/hubs/chat");

app.Run();

Créer un hub

Héritez de Hub. Les méthodes du hub sont appelées par les clients. La propriété Context fournit les informations de connexion, et Clients vous permet de renvoyer des messages.

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();
    }
}

Client JavaScript

Le client JavaScript officiel de SignalR établit une connexion, enregistre des gestionnaires d’événements et démarre la connexion. Les méthodes définies sur le hub peuvent être appelées depuis JavaScript.

// 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!");

Client SignalR .NET

Le client .NET fonctionne de la même manière — il est utile pour la communication en temps réel de service à service ou pour les applications de bureau et mobiles.

// 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!");

Envoyer des messages à des clients précis

La propriété Clients possède des méthodes permettant de cibler des connexions précises, les appelants ou tous les clients connectés à l’exception de ceux qui sont indiqués.

// 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);

Contexte du hub : envoyer des messages depuis l’extérieur du hub

Injectez IHubContext<T> dans des services ou des tâches d’arrière-plan pour envoyer des messages depuis l’extérieur de la classe du hub — ce qui est essentiel pour les transmissions initiées par le serveur.

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);
    }
}

Événements du cycle de vie des connexions

Remplacez OnConnectedAsync et OnDisconnectedAsync pour suivre les connexions, conserver l’état ou libérer les ressources.

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;

Reconnexion automatique

Activez la reconnexion automatique côté client pour gérer élégamment les déconnexions temporaires. Vous pouvez personnaliser les délais de nouvelle tentative.

// 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));

Authentification avec SignalR

SignalR respecte l’intergiciel d’authentification ASP.NET Core. Ajoutez [Authorize] à la classe du hub ou utilisez le handler JWT qui prend en charge les jetons dans la chaîne de requête (nécessaires à l’authentification WebSocket).

[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;
        }
    };
});

Vérification rapide

Comment envoyer un message SignalR depuis un service d’arrière-plan (en dehors de la classe du hub) ?

Récapitulatif : hubs et connexions SignalR

Points clés à retenir :

  • SignalR choisit automatiquement le meilleur transport (WebSockets, SSE, interrogation longue)
  • Les méthodes du hub peuvent être appelées par les clients ; Clients.* cible des destinataires précis
  • Injectez IHubContext<T> pour envoyer des messages depuis l’extérieur du hub
  • Remplacez OnConnectedAsync/OnDisconnectedAsync pour gérer le cycle de vie
  • Utilisez withAutomaticReconnect() pour des connexions client résilientes
  • L’authentification JWT via la chaîne de requête est requise pour les connexions WebSocket
Gratuit pour commencer

Apprends C# avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
93
Leçons
346

Questions Fréquemment Posées

La leçon « Hubs et connexions SignalR » est-elle gratuite ?

Oui — le texte complet de « Hubs et connexions SignalR » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Hubs et connexions SignalR » ?

Créez un hub SignalR, mappez-le dans ASP.NET Core et établissez des connexions WebSocket depuis des clients JavaScript et .NET. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C# Academy ?

Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Hubs et connexions SignalR » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?

Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Hubs et connexions SignalR
  2. Groupes, utilisateurs et gestion des connexions
  3. Hubs fortement typés
  4. Mise à l’échelle avec un relais Redis
← Retour à C# Academy