Blog

Verwenden von ASP.NET Core SignalR in einer Blazor Web-App und .NET 8

Benedikt
Inhaber & Geschäftsführer

Einstieg

ASP.NET Core SignalR ist eine Open-Source-Bibliothek zur Vereinfachung der Integration von Echtzeit-Webfunktionalitäten. In der Anwendung ermöglicht es serverseitigem Code, Inhalte direkt an Clients zu senden. Diese Technologie eignet sich besonders für Anwendungen, die regelmäßige und schnelle Aktualisierungen vom Server benötigen, wie z.B. Spiele, soziale Medien, Abstimmungssysteme, Auktionen sowie Karten- und GPS-basierte Dienste. Darüber hinaus profitieren Dashboards und Überwachungstools, die Echtzeitinformationen wie Verkaufszahlen oder Reisehinweise anzeigen, erheblich von SignalR. Ebenfalls ideal ist SignalR für kollaborative Anwendungen, wie digitale Whiteboards und Software für Teammeetings, sowie für jegliche Apps, die auf Benachrichtigungssysteme angewiesen sind.

Voraussetzungen

  • Visual Studio 2022 mit den Workloads ASP.NET und Webentwicklung

Dieses Tutorial lässt sich ebenfalls unter Verwendung von Visual Studio Code und der .NET Core-CLI durchführen, sofern die erforderlichen Pakete zuvor installiert worden sind.

Schritt 1: Erstellen eines Blazor Projekts

  1. Erstellen Sie ein neues Projekt und wählen Sie Blazor Web App aus.
  2. Nehmen Sie im ersten Schritt die gewünschte Konfiguration vor
  3. Im zweiten Schritt wird .NET 8 als Framework ausgewählt und der interactive render mode auf None gestellt

Schritt 2: Hinzufügen der SignalR NuGet-Pakete

  1. Klicken Sie im Solution Explorer mit der rechten Maustaste auf Ihr Projekt und wählen Sie Manage NuGet Packages aus.
  2. Geben Sie in das Suchfeld SignalR ein
  3. Wählen sie die neuste Version von Microsoft.AspNetCore.SignalR.Client aus und installieren Sie diese.
  4. Sobald weitere Abhängigkeiten und Änderungen angezeigt werden, klicken Sie auf OK.
  5. Wenn die Zustimmung zur Lizenz angezeigt wird, können Sie diese bestätigen.

Schritt 3: Erstellen eines SignalR-Hubs

  1. Legen Sie innerhalb Ihres Projekts einen Ordner mit dem Namen Hubs an
  2. In den Ordner Hubs fügen Sie eine Klasse mit dem Namen MessageHub.cs ein
  3. Den Inhalt der Klasse überschreiben Sie bitte mit folgendem Code:
using Microsoft.AspNetCore.SignalR;
namespace BlazorSignalRApp.Hubs;

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

Schritt 4: Hinzufügen von Diensten und Einrichtung eines Endpunkts für den SignalR-Hub

  1. In der Klasse Program.cs müssen folgenden Änderungen vorgenommen werden:
  • Hinzufügen der Usings des MessageHubs und der ResponseCompression
using Microsoft.AspNetCore.ResponseCompression;
using BlazorSignalR.Hubs;

Ändern des Rendermodes: AddInteractiveServerComponents

builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
app.MapRazorComponents()
.AddInteractiveServerRenderMode();

Einfügen von Middleware-Diensten zur Komprimierung von Antworten

builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});

Hinzufügen der ResponseCompression

app.UseResponseCompression();

Endpunkt für den Hub einfügen

app.MapHub("/messagehub");

Der vollständige Code sollte wie folgt aussehen:

using BlazorSignalR.Components;
using Microsoft.AspNetCore.ResponseCompression;
using BlazorSignalR.Hubs;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();

builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}

app.UseResponseCompression();

app.UseHttpsRedirection();

app.UseStaticFiles();
app.UseAntiforgery();

app.MapRazorComponents()
.AddInteractiveServerRenderMode();

app.MapHub("/messagehub");

app.Run();

Schritt 5: Erstellen einer Razor-Komponente für einen Nachrichtendienst

  1. Erstellen Sie eine neue Razor-Page in dem Ordner Components/Pages/
  2. Fügen Sie folgende Razor-Direktive hinzu. Geben Sie den Rendermode wie folgt an
@page "/chat"
@rendermode InteractiveServer
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@implements IAsyncDisposable
  1. Erstellen Sie eine kleine Eingabemaske, in welcher ein User und die entsprechende Nachricht eingegeben werden kann






  1. Fügen Sie der Razor-Page ein Listenelement hinzu, die alle Nachrichten untereinander auflistet.

    @foreach (var message in messages)
    {
  • @message

  • }
  1. Fügen Sie folgende Felder und Methoden hinzu, um sich mit dem Hub zu verbinden und die eingegebenen Nachrichten im Frontend auszugeben.

Private Felder

private HubConnection? hubConnection;
private List messages = new List();
private string? userInput;
private string? messageInput;

OnInitializedAsync Initialisierung einer asynchronen SignalR-Verbindung zum /messageHub und einrichten eines Event-Handlers zum Empfangen der Nachrichten.

protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/messagehub"))
.Build();

hubConnection.On("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
messages.Add(encodedMsg);
InvokeAsync(StateHasChanged);
});

await hubConnection.StartAsync();
}

Send Senden einer asynchronen Nachricht, sofern die Verbindung zum Hub besteht.

private async Task Send()
{
if (hubConnection is not null)
{
await hubConnection.SendAsync("SendMessage", userInput, messageInput);
}
}

IsConnected Hier wird überprüft, ob die Verbindung zum Hub besteht

public bool IsConnected =>
hubConnection?.State == HubConnectionState.Connected;

DisposeAsync Sofern die hubConnection exisiert, wird die Methode zur Freigabe/Bereinigung aufgerufen

public async ValueTask DisposeAsync()
{
if (hubConnection is not null)
{
await hubConnection.DisposeAsync();
}
}

Der ganze Code sollte wie folgt aussehen:

@page "/chat"
@rendermode InteractiveServer
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@implements IAsyncDisposable













    @foreach (var message in messages)
    {
  • @message

  • }


@code {
private HubConnection? hubConnection;
private List messages = new List();
private string? userInput;
private string? messageInput;

protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/messagehub"))
.Build();

hubConnection.On("ReceiveMessage", (user, message) =>
{
var encodedMsg = $"{user}: {message}";
messages.Add(encodedMsg);
InvokeAsync(StateHasChanged);
});

await hubConnection.StartAsync();
}

private async Task Send()
{
if (hubConnection is not null)
{
await hubConnection.SendAsync("SendMessage", userInput, messageInput);
}
}

public bool IsConnected =>
hubConnection?.State == HubConnectionState.Connected;

public async ValueTask DisposeAsync()
{
if (hubConnection is not null)
{
await hubConnection.DisposeAsync();
}
}
}

Schritt 6: Testen des Nachrichtensystems

  1. Starten Sie Ihr Projekt
  2. Fügen Sie der URL “/chat” hinzu, um zum Nachrichtensystem zu gelangen
  1. Kopieren Sie die ganze URL und rufen Sie diese in einem neuen Browser auf
  2. Schicken Sie über eines der Browser unter Angabe eines Users und einer Message ab
  3. Kontrollieren Sie im anderen Browserfenster, ob die Nachricht angekommen ist
  4. Wiederholen Sie das Verschicken einer Nachricht im anderen Browser

Fazit

Nach der Durchführung aller Schritte erhalten Sie einen grundlegenden Überblick über eine mögliche Implementierung einer Echtzeit-Anwendung. Diese Basis kann weiterentwickelt werden, um verschiedene Funktionen für unterschiedliche Benutzergruppen und Anwender zu integrieren. Zudem besteht die Möglichkeit, durch die Erstellung mehrerer Hubs ein Überwachungssystem zu implementieren, das administrative Nutzer automatisch alarmiert, sollte beispielsweise eine SQL-Datenbank einen kritischen Zustand erreichen.

Wenn Sie noch mehr über dieses Thema erfahren möchten oder aber eine Unterstützung bei der Einrichtung von ASP.NET Core SignalR benötigen, stehen Ihnen unsere Expert:innen gerne zur Verfügung. Kontaktieren Sie uns dafür gerne über unser Kontaktformular oder rufen Sie uns einfach an.

Interesse geweckt?
Vielen Dank! Wir haben Ihre Anfrage erhalten!
Oops! Beim Senden ist etwas schiefgegangen, versuche es erneut.