SignalR 101 - Eine Einführung für .NET 8

SignalR 101 - Eine Einführung für .NET 8

23 Jan 2025 - Matthias Voigt

Echtzeitkommunikation im Web ist heutzutage ein entscheidender Bestandteil moderner Webentwicklung. Sie ermöglicht es Webanwendungen, Daten in Echtzeit zu senden und zu empfangen, wodurch eine reaktionsfähigere und interaktivere Benutzererfahrung geschaffen wird.

Einführung in SignalR und Echtzeitkommunikation

SignalR ist eine .NET-Bibliothek, die die Implementierung von Echtzeitfunktionen in Webanwendungen erheblich vereinfacht. In diesem Beitrag werden wir die Grundlagen von SignalR in .NET 8 erkunden und lernen, wie es in eine Webanwendung integriert werden kann.

Wir beginnen mit der Einrichtung eines neuen SignalR-Projekts in .NET 8 und gehen auf die grundlegende Struktur eines SignalR-Projekts ein. Danach sehen wir uns an, wie Nachrichten zwischen Client und Server ausgetauscht werden können.

Nach der Lektüre dieses Beitrags wirst du verstehen, wie du Echtzeitkommunikation mit SignalR in deinen .NET-8-Projekten umsetzt.


Was ist Echtzeitkommunikation und warum SignalR?

Echtzeitkommunikation ermöglicht es Webanwendungen, Daten sofort zu senden und zu empfangen, ohne dass ein manuelles Neuladen der Seite erforderlich ist. Dies ist besonders nützlich für Anwendungen wie:

  • Chat-Anwendungen, bei denen Nachrichten in Echtzeit zwischen Benutzern ausgetauscht werden.
  • Live-Tracking-Systeme, bei denen Updates ohne Verzögerung angezeigt werden.
  • Echtzeitbenachrichtigungen, um Nutzer sofort über Ereignisse zu informieren.

SignalR ist eine von Microsoft entwickelte Open-Source-Bibliothek, die WebSockets, Server-Sent Events (SSE) oder Long Polling verwendet, um eine Echtzeitverbindung zwischen Client und Server herzustellen. Dabei wählt SignalR automatisch das beste verfügbare Protokoll, um eine zuverlässige Verbindung sicherzustellen.


Hubs und Clients in SignalR

Hubs (Server-Seite)

In SignalR werden Server-seitige Komponenten als Hubs bezeichnet. Ein Hub ist eine C#-Klasse, die von Microsoft.AspNetCore.SignalR.Hub erbt und Methoden enthält, die Clients aufrufen können. Außerdem kann der Server über den Hub Nachrichten an einzelne Clients oder Gruppen von Clients senden.

Clients (Client-Seite)

Clients sind die Webanwendungen oder Anwendungen, die sich mit einem Hub verbinden, um Daten zu senden oder zu empfangen. Clients können mit JavaScript, C# oder anderen Sprachen implementiert werden. Die SignalR-Clientbibliothek stellt die Verbindung zum Hub her und verwaltet die Kommunikation automatisch.


SignalR-Demo: Einfache Server- und Client-Implementierung

Nun setzen wir das theoretische Wissen in die Praxis um. Wir erstellen zwei Projekte: einen Server (Web-API) und einen Client (Konsolenanwendung).

1. Einrichtung des Servers

Erstelle zunächst ein neues leeres Web-API-Projekt in .NET 8. Dann fügen wir die SignalR-Bibliothek hinzu:

dotnet add package Microsoft.AspNetCore.SignalR

Jetzt erstellen wir eine Hub-Klasse namens MessageHub:

public class Message
{
    public string? Username { get; set; }
    public string? Message { get; set; }
    public DateTime Timestamp { get; set; }
}

using Microsoft.AspNetCore.SignalR;

public class MessageHub : Hub
{
    public async Task SendMessage(Message message)
    {
        await Clients.All.SendAsync("ReceiveMessage", message);
    }
}

Die Zeile:

await Clients.All.SendAsync("ReceiveMessage", message);

bedeutet, dass die Nachricht an alle verbundenen Clients gesendet wird, die das Ereignis ReceiveMessage abonniert haben.

2. Registrierung des Hubs in Program.cs

Jetzt muss der Hub im Program.cs registriert werden:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors();
builder.Services.AddSignalR();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseCors(builder => builder
    .AllowAnyOrigin()
    .AllowAnyMethod()
    .AllowAnyHeader());

app.MapHub<MessageHub>("/messagehub");

app.Run();

Hier passiert Folgendes:

  • builder.Services.AddSignalR(); → Fügt die SignalR-Dienste zur Dependency Injection hinzu.
  • app.MapHub<MessageHub>("/messagehub"); → Registriert den Hub unter der URL /messagehub.

3. Einrichtung des Clients

Nun erstellen wir eine Konsolenanwendung, die mit dem Server kommuniziert. Dazu fügen wir das SignalR-Client-Paket hinzu:

dotnet add package Microsoft.AspNetCore.SignalR.Client

Dann erstellen wir eine Verbindung zum Hub:

using Microsoft.AspNetCore.SignalR.Client;

var connection = new HubConnectionBuilder()
    .WithUrl("http://localhost:5038/messagehub")
    .Build();

Hier wird eine neue HubConnection erstellt, die sich mit http://localhost:5038/messagehub verbindet.

4. Empfang und Senden von Nachrichten

Jetzt starten wir die Verbindung und abonnieren das ReceiveMessage-Ereignis:

try
{
    await connection.StartAsync();
    Console.WriteLine("Verbunden mit SignalR-Hub");

    connection.On<Message>("ReceiveMessage", (message) =>
    {
        Console.WriteLine($"{message.Username}: {message.Message}");
    });

    var notifyMessage = new Message
    {
        Username = "John Doe"
    };

    while (true)
    {
        Console.WriteLine("Gib eine Nachricht ein:");
        var messageText = Console.ReadLine();
        notifyMessage.Message = messageText;

        await connection.InvokeAsync("SendMessage", notifyMessage);
        Console.WriteLine("Nachricht gesendet");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Fehler: {ex.Message}");
}

Erklärung:

  • await connection.StartAsync(); → Verbindet den Client mit dem Hub.
  • connection.On<Message>("ReceiveMessage", (message) => { ... }); → Registriert einen Event-Handler für eingehende Nachrichten.
  • await connection.InvokeAsync("SendMessage", notifyMessage); → Sendet eine Nachricht an den Server.

Vorteile von SignalR

Echtzeit-Kommunikation ohne manuelle Aktualisierung
Einfache Implementierung durch hohe Abstraktion
Unterstützung für verschiedene Protokolle (WebSockets, SSE, Long Polling)
Cross-Platform-Unterstützung für verschiedene Clients
Skalierbarkeit mit Redis oder Azure SignalR Service


Wann sollte man SignalR nutzen?

SignalR ist ideal für Anwendungen, die:

  • Echtzeit-Updates erfordern (z. B. Chat, Benachrichtigungen, Live-Daten-Updates)
  • Interaktive Nutzererfahrungen bieten wollen
  • Skalierbare Kommunikation zwischen vielen Clients benötigen

Wann ist SignalR nicht geeignet?

🚫 Wenn eine Anwendung keine Echtzeitkommunikation benötigt
🚫 Bei schlechten oder instabilen Netzwerkverbindungen
🚫 Falls ältere Browser oder Geräte unterstützt werden müssen, die keine modernen Web-Technologien nutzen


Fazit

SignalR ist eine leistungsstarke und einfach zu verwendende Lösung für Echtzeitkommunikation in .NET 8. Mit wenigen Zeilen Code lassen sich interaktive Web- und Desktop-Anwendungen erstellen, die nahtlos Daten in Echtzeit austauschen.

Wenn du eine Webanwendung mit Echtzeit-Funktionalität benötigst, ist SignalR definitiv eine Technologie, die du in Betracht ziehen solltest!