ASP.NET Core-Blazor-SignalR-Leitfaden

In diesem Artikel wird das Konfigurieren und Verwalten von SignalR Verbindungen in Blazor-Apps erläutert.

Allgemeine Anleitungen zur Konfiguration von ASP.NET Core SignalR finden Sie in den Artikeln im Bereich Übersicht über ASP.NET Core SignalR der Dokumentation. Informationen zur Konfiguration von SignalR, das einer gehosteten Blazor WebAssemblyLösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende Aushandlung für die Authentifizierung für SignalR (Blazor WebAssembly)

So konfigurieren Sie den zugrunde liegenden SignalR-Client zum Senden von Anmeldeinformationen (z. B. cookie oder HTTP-Authentifizierungsheader):

  • Verwenden Sie SetBrowserRequestCredentials, um Include für ursprungsübergreifende fetch-Anforderungen festzulegen.

    IncludeRequestCredentialsMessageHandler.cs:

    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Components.WebAssembly.Http;
    
    public class IncludeRequestCredentialsMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
            return base.SendAsync(request, cancellationToken);
        }
    }
    
  • Wenn eine Hubverbindung erstellt wird, weisen Sie den HttpMessageHandler der Option HttpMessageHandlerFactory zu:

    private HubConnectionBuilder? hubConnection;
    
    ...
    
    hubConnection = new HubConnectionBuilder()
        .WithUrl(new Uri(NavigationManager.ToAbsoluteUri("/chathub")), options =>
        {
            options.HttpMessageHandlerFactory = innerHandler => 
                new IncludeRequestCredentialsMessageHandler { InnerHandler = innerHandler };
        }).Build();
    

    Im vorherigen Beispiel wird die Hub-Verbindungs-URL mit der absoluten URI-Adresse auf /chathub konfiguriert. Dabei handelt es sich um den im SignalR aus dem Blazor-Tutorial in der Index-Komponente (Pages/Index.razor) verwendeten URL. Der URI kann auch über eine Zeichenfolge wie https://signalr.example.com oder über die Konfiguration festgelegt werden.

Weitere Informationen finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Rendermodus (Blazor WebAssembly)

Wenn eine Blazor WebAssembly-App, die SignalR verwendet, so konfiguriert ist, dass das Prerendering auf dem Server ausgeführt wird, erfolgt dieses vor dem Herstellen der Clientverbindung mit dem Server. Weitere Informationen finden Sie in den folgenden Artikeln:

Zusätzliche Ressourcen für Blazor WebAssembly-Apps

Verwenden persistenter Sitzungen für Webfarmhosting (Blazor Server)

Als Reaktion auf die erste Clientanforderung führt die Blazor Server-App ein Prerendering aus, das den Status der Benutzeroberfläche auf dem Server festlegt. Versucht der Client, eine SignalR-Verbindung zu erstellen, muss er mit demselben Server erneut eine Verbindung herstellen. Blazor Server-Apps mit mehr als einem Back-End-Server sollten für SignalR-Verbindungen persistente Sitzungen implementieren.

Hinweis

Der folgende Fehler wird von einer App ausgelöst, die keine persistenten Sitzungen in einer Webfarm aktiviert hat:

blazor.server.js:1 Uncaught (in promise) Error: Invocation canceled due to the underlying connection being closed. (Nicht abgefangen (in Zusage) Fehler: Der Aufruf wurde abgebrochen, weil die zugrunde liegende Verbindung beendet wurde.)

Azure SignalR Service (Blazor Server)

Wir empfehlen die Verwendung von Azure SignalR Service für in Microsoft Azure gehostete Blazor Server-Apps. Der Dienst arbeitet mit dem Blazor-Hub der App zusammen, um eine Blazor Server-App für eine große Anzahl gleichzeitiger SignalR-Verbindungen hochskalieren zu können. Außerdem tragen die globale Reichweite und die Hochleistungsrechenzentren von SignalR Service erheblich zur Verringerung der geografiebedingten Latenz bei.

Bei Azure SignalR Service werden persistente Sitzungen aktiviert, indem die Option ServerStickyMode des Diensts oder dessen Konfigurationswert auf Required festgelegt wird. Weitere Informationen finden Sie unter Hosten und Bereitstellen von Blazor Server in ASP.NET Core.

Optionen für den Verbindungshandler für Blazor Server-Apps

Konfigurieren Sie die Verbindung Blazor Server mit der in der folgenden Tabelle dargestellten CircuitOptions-Klasse.

Option Standard Beschreibung
DetailedErrors false Sendet detaillierte Ausnahmemeldungen an JavaScript, wenn bei der Verbindung ein Ausnahmefehler auftritt oder wenn ein .NET-Methodenaufruf über JS-Interop eine Ausnahme verursacht.
DisconnectedCircuitMaxRetained 100 Die maximale Anzahl der getrennten Circuits, die sich gleichzeitig im Arbeitsspeicher des Servers befinden können.
DisconnectedCircuitRetentionPeriod 3 Minuten Maximale Zeitspanne, die ein getrennter Circuit im Arbeitsspeicher aufbewahrt wird, bevor er entfernt wird
JSInteropDefaultCallTimeout 1 Minute Maximale Zeitspanne, die der Server wartet, bevor der Aufruf einer asynchronen JavaScript-Funktion durch ein Timeout beendet wird
MaxBufferedUnacknowledgedRenderBatches 10 Maximale Anzahl nicht unbestätigter Renderbatches, die der Server zu einem bestimmten Zeitpunkt pro Circuit im Arbeitsspeicher aufbewahrt, um eine stabile Neuverbindung zu ermöglichen. Wenn die Obergrenze erreicht wird, generiert der Server keine neuen Renderbatches mehr, bis mindestens ein Batch vom Client bestätigt wurde.

Konfigurieren Sie die Optionen in Program.cs mit den Optionsdelegat zu AddServerSideBlazor. Im folgenden Beispiel werden die Standardoptionswerte aus der Tabelle oben zugewiesen. Vergewissern Sie sich, dass Program.cs den System-Namespace (using System;) verwendet.

In Program.cs:

builder.Services.AddServerSideBlazor(options =>
{
    options.DetailedErrors = false;
    options.DisconnectedCircuitMaxRetained = 100;
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(3);
    options.JSInteropDefaultCallTimeout = TimeSpan.FromMinutes(1);
    options.MaxBufferedUnacknowledgedRenderBatches = 10;
});

Verwenden Sie HubConnectionContextOptions mit AddHubOptions, um HubConnectionContext zu konfigurieren. Optionsbeschreibungen finden Sie unter SignalR-Konfiguration in ASP.NET Core. Im folgenden Beispiel werden die Standardoptionswerte zugewiesen. Vergewissern Sie sich, dass Program.cs den System-Namespace (using System;) verwendet.

In Program.cs:

builder.Services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
        options.EnableDetailedErrors = false;
        options.HandshakeTimeout = TimeSpan.FromSeconds(15);
        options.KeepAliveInterval = TimeSpan.FromSeconds(15);
        options.MaximumParallelInvocationsPerClient = 1;
        options.MaximumReceiveMessageSize = 32 * 1024;
        options.StreamBufferCapacity = 10;
    });

Routenkonfiguration für den Hubendpunkt von Blazor (Blazor Server)

In der Program.cs-Datei rufen Blazor Server-Apps MapBlazorHub auf, um den Blazor-Hub dem Standardpfad der App zuzuordnen. Das Blazor Server-Skript (blazor.server.js) verweist automatisch auf den durch MapBlazorHub erstellten Endpunkt.

Reflektieren des Verbindungszustands auf der Benutzeroberfläche (Blazor Server)

Wenn der Client erkennt, dass keine Verbindung mehr besteht, wird dem Benutzer eine Standardbenutzeroberfläche angezeigt, während der Client versucht, eine neue Verbindung herzustellen. Wenn die Wiederherstellung der Verbindung fehlschlägt, wird dem Benutzer die Option angezeigt, es noch mal zu versuchen.

Wenn Sie die Benutzeroberfläche anpassen möchten, definieren Sie ein Element mit der id von components-reconnect-modal im <body> der Razor-Seite _Layout.cshtml.

Pages/_Layout.cshtml:

<div id="components-reconnect-modal">
    ...
</div>

Fügen Sie dem Stylesheet der Website die folgenden CSS-Stile hinzu.

wwwroot/css/site.css:

#components-reconnect-modal {
    display: none;
}

#components-reconnect-modal.components-reconnect-show {
    display: block;
}

In der folgenden Tabelle werden die CSS-Klassen beschrieben, die vom Blazor-Framework auf das components-reconnect-modal-Element angewendet werden.

CSS-Klasse Bedeutung
components-reconnect-show Die Verbindung wurde getrennt. Der Client versucht, die Verbindung wiederherzustellen. Die modale Seite wird angezeigt.
components-reconnect-hide Auf dem Server wird eine aktive Verbindung wiederhergestellt. Die modale Seite wird ausgeblendet.
components-reconnect-failed Die Wiederherstellung der Verbindung ist wahrscheinlich aufgrund eines Netzwerkfehlers fehlgeschlagen. Zum erneuten Herstellen der Verbindung rufen Sie window.Blazor.reconnect() in JavaScript auf.
components-reconnect-rejected Die Wiederherstellung der Verbindung wurde abgelehnt. Der Server wurde zwar erreicht, jedoch hat dieser die Verbindung verweigert. Der Status des Benutzers auf dem Server wurde verworfen. Rufen Sie location.reload() in JavaScript auf, um die App neu zu laden. Dieser Verbindungszustand kann aus folgenden Gründen auftreten:
  • Aufgetretener Absturz auf der serverseitigen Verbindung.
  • Der Client war lange nicht verbunden, sodass der Server den Benutzerstatus verworfen hat. Instanzen der Komponenten des Benutzers werden verworfen.
  • Der Server wird neu gestartet, oder der Workerprozess der App wird wiederverwendet.

Passen Sie die Verzögerung an, bevor die Anzeige einer erneuten Verbindungsherstellung eingeblendet wird, indem Sie die transition-delay-Eigenschaft im CSS der Website für das modale Element festlegen. Im folgenden Beispiel wird die Übergangsverzögerung von 500 ms (Standard) auf 1.000 ms (1 Sekunde) festgelegt.

wwwroot/css/site.css:

#components-reconnect-modal {
    transition: visibility 0s linear 1000ms;
}

Rendermodus (Blazor Server)

Standardmäßig rendern Blazor Server-Apps die Benutzeroberfläche auf dem Server schon vor dem Herstellen der Clientverbindung mit dem Server. Weitere Informationen finden Sie unter Taghilfsprogramm für Komponenten in ASP.NET Core.

Blazor-Start (Blazor Server)

Konfigurieren Sie den manuellen Start der SignalR-Verbindung einer Blazor Server-App in der Datei Pages/_Layout.cshtml:

  • Fügen Sie ein autostart="false"-Attribut zum <script>-Tag für das blazor.server.js-Skript hinzu.
  • Fügen Sie ein Skript, das Blazor.start aufruft, nach dem <script>-Tag des blazor.server.js-Skripts und innerhalb des schließenden </body>-Tags ein.

Wenn autostart deaktiviert ist, funktionieren alle Aspekte der App, die nicht von der Verbindung abhängen, normal. So ist beispielsweise das clientseitige Routing betriebsbereit. Aspekte, die von der Verbindung abhängen, sind jedoch erst betriebsbereit, nachdem Blazor.start aufgerufen wurde. Das App-Verhalten ist ohne eine bestehende Verbindung unvorhersehbar. Komponentenmethoden können beispielsweise nicht ausgeführt werden, solange die Verbindung getrennt ist.

Weitere Informationen einschließlich der zur Blazor-Initialisierung, wenn das Dokument bereit ist, und der Verkettung mit einer JS-Zusage finden Sie unter Starten von ASP.NET Core Blazor.

Konfigurieren der SignalR-Clientprotokollierung (Blazor Server)

Übergeben Sie für den Client-Generator das Konfigurationsobjekt configureSignalR, das configureLogging mit der Protokollebene aufruft.

Pages/_Layout.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        configureSignalR: function (builder) {
          builder.configureLogging("information");
        }
      });
    </script>
</body>

Im vorherigen Beispiel entspricht information der Protokollebene LogLevel.Information.

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Ändern des Handlers für die Wiederherstellung einer Verbindung (Blazor Server)

Die Verbindungsereignisse des Handlers für die Wiederherstellung einer Verbindung können geändert werden, um benutzerdefinierte Verhaltensweisen zu erzeugen, z. B. für Folgendes:

  • Benachrichtigung an einen Benutzer, wenn die Verbindung unterbrochen wird
  • Ausführen der Protokollierung (vom Client), wenn eine Verbindung besteht

Zum Ändern der Verbindungsereignisse registrieren Sie Rückrufe für die folgenden Verbindungsänderungen:

  • Unterbrochene Verbindungen verwenden onConnectionDown.
  • Hergestellte/wieder hergestellte Verbindungen verwenden onConnectionUp.

Es müssen sowohl onConnectionDown als auch onConnectionUp angegeben werden.

Pages/_Layout.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionHandler: {
          onConnectionDown: (options, error) => console.error(error),
          onConnectionUp: () => console.log("Up, up, and away!")
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Anpassen von Anzahl und Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung (Blazor Server)

Legen Sie zum Anpassen der Anzahl und des Intervalls der Wiederholungsversuche zum erneuten Herstellen einer Verbindung die zulässige Anzahl von Wiederholungsversuchen (maxRetries) und den zulässigen Zeitraum in Millisekunden (retryIntervalMilliseconds) für jeden Versuch fest.

Pages/_Layout.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionOptions: {
          maxRetries: 3,
          retryIntervalMilliseconds: 2000
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Trennen der Blazor-Verbindung vom Client (Blazor Server)

Standardmäßig wird eine Blazor-Verbindung getrennt, wenn das unload-Ereignis der Seite ausgelöst wird. Um die Verbindung in anderen Szenarien auf dem Client zu trennen, rufen Sie Blazor.disconnect im entsprechenden Ereignishandler auf. Im folgenden Beispiel wird die Verbindung getrennt, wenn die Seite ausgeblendet wird (pagehide-Ereignis):

window.addEventListener('pagehide', () => {
  Blazor.disconnect();
});

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Blazor Server-Verbindungshandler

In Blazor Server kann mithilfe von Code ein Verbindungshandler definiert werden, mit dem Code für Zustandsänderungen einer Benutzerverbindung ausgeführt werden kann. Ein Verbindungshandler wird durch das Ableiten von CircuitHandler und Registrieren der Klasse im Dienstcontainer der App implementiert. Im folgenden Beispiel für einen Verbindungshandlers werden geöffnete SignalR-Verbindungen nachverfolgt.

TrackingCircuitHandler.cs:

using Microsoft.AspNetCore.Components.Server.Circuits;

public class TrackingCircuitHandler : CircuitHandler
{
    private HashSet<Circuit> circuits = new();

    public override Task OnConnectionUpAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Add(circuit);

        return Task.CompletedTask;
    }

    public override Task OnConnectionDownAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Remove(circuit);

        return Task.CompletedTask;
    }

    public int ConnectedCircuits => circuits.Count;
}

Verbindungshandler werden mithilfe von DI registriert. Bereichsbezogene Instanzen werden pro Verbindungsinstanz erstellt. Mithilfe von TrackingCircuitHandler aus dem Beispiel oben wird ein Singletondienst erstellt, weil der Zustand aller Verbindungen nachverfolgt werden muss.

In Program.cs:

builder.Services.AddSingleton<CircuitHandler, TrackingCircuitHandler>();

Wenn die Methoden eines benutzerdefinierten Verbindungshandlers einen Ausnahmefehler auslösen, ist dieser Ausnahmefehler für die Blazor Server-Verbindung schwerwiegend. Umschließen Sie den Code in einer oder mehreren try-catch-Anweisungen mit Fehlerbehandlung und -protokollierung, um Ausnahmen im Code oder in aufgerufenen Methoden eines Handlers zu tolerieren.

Wenn eine Verbindung beendet wird, weil ein Benutzer die Verbindung getrennt hat und das Framework den Verbindungsstatus bereinigt, gibt das Framework den DI-Bereich der Verbindung frei. Wenn der Bereich freigegeben wird, werden alle Dienste im Verbindungsbereich verworfen, die System.IDisposable implementieren. Wenn ein DI-Dienst während der Freigabe einen Ausnahmefehler auslöst, protokolliert das Framework die Ausnahme. Weitere Informationen finden Sie unter Abhängigkeitsinjektion in ASP.NET Core Blazor.

Zusätzliche Ressourcen für Blazor Server-Apps

Allgemeine Anleitungen zur Konfiguration von ASP.NET Core SignalR finden Sie in den Artikeln im Bereich Übersicht über ASP.NET Core SignalR der Dokumentation. Informationen zur Konfiguration von SignalR, das einer gehosteten Blazor WebAssemblyLösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende Aushandlung für die Authentifizierung für SignalR (Blazor WebAssembly)

So konfigurieren Sie den zugrunde liegenden SignalR-Client zum Senden von Anmeldeinformationen (z. B. cookie oder HTTP-Authentifizierungsheader):

  • Verwenden Sie SetBrowserRequestCredentials, um Include für ursprungsübergreifende fetch-Anforderungen festzulegen.

    IncludeRequestCredentialsMessageHandler.cs:

    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Components.WebAssembly.Http;
    
    public class IncludeRequestCredentialsMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
            return base.SendAsync(request, cancellationToken);
        }
    }
    
  • Wenn eine Hubverbindung erstellt wird, weisen Sie den HttpMessageHandler der Option HttpMessageHandlerFactory zu:

    HubConnectionBuilder hubConnection;
    
    ...
    
    hubConnection = new HubConnectionBuilder()
        .WithUrl(new Uri(NavigationManager.ToAbsoluteUri("/chathub")), options =>
        {
            options.HttpMessageHandlerFactory = innerHandler => 
                new IncludeRequestCredentialsMessageHandler { InnerHandler = innerHandler };
        }).Build();
    

    Im vorherigen Beispiel wird die Hub-Verbindungs-URL mit der absoluten URI-Adresse auf /chathub konfiguriert. Dabei handelt es sich um den im SignalR aus dem Blazor-Tutorial in der Index-Komponente (Pages/Index.razor) verwendeten URL. Der URI kann auch über eine Zeichenfolge wie https://signalr.example.com oder über die Konfiguration festgelegt werden.

Weitere Informationen finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Rendermodus (Blazor WebAssembly)

Wenn eine Blazor WebAssembly-App, die SignalR verwendet, so konfiguriert ist, dass das Prerendering auf dem Server ausgeführt wird, erfolgt dieses vor dem Herstellen der Clientverbindung mit dem Server. Weitere Informationen finden Sie in den folgenden Artikeln:

Zusätzliche Ressourcen für Blazor WebAssembly-Apps

Verwenden persistenter Sitzungen für Webfarmhosting (Blazor Server)

Als Reaktion auf die erste Clientanforderung führt die Blazor Server-App ein Prerendering aus, das den Zustand der Benutzeroberfläche auf dem Server festlegt. Versucht der Client, eine SignalR-Verbindung zu erstellen, muss er mit demselben Server erneut eine Verbindung herstellen. Blazor Server-Apps mit mehr als einem Back-End-Server sollten für SignalR-Verbindungen persistente Sitzungen implementieren.

Hinweis

Der folgende Fehler wird von einer App ausgelöst, die keine persistenten Sitzungen in einer Webfarm aktiviert hat:

blazor.server.js:1 Uncaught (in promise) Error: Invocation canceled due to the underlying connection being closed. (Nicht abgefangen (in Zusage) Fehler: Der Aufruf wurde abgebrochen, weil die zugrunde liegende Verbindung beendet wurde.)

Azure SignalR Service (Blazor Server)

Wir empfehlen die Verwendung von Azure SignalR Service für in Microsoft Azure gehostete Blazor Server-Apps. Der Dienst arbeitet mit dem Blazor-Hub der App zusammen, um eine Blazor Server-App für eine große Anzahl gleichzeitiger SignalR-Verbindungen hochskalieren zu können. Außerdem tragen die globale Reichweite und die Hochleistungsrechenzentren von SignalR Service erheblich zur Verringerung der geografiebedingten Latenz bei.

Um Unterstützung für Vorabrendern in Azure SignalR Service zu erhalten, konfigurieren Sie die App für die Verwendung von persistenten Sitzungen. Weitere Informationen finden Sie unter Hosten und Bereitstellen von Blazor Server in ASP.NET Core.

Optionen für den Verbindungshandler für Blazor Server-Apps

Konfigurieren Sie die Verbindung Blazor Server mit der in der folgenden Tabelle dargestellten CircuitOptions-Klasse.

Option Standard Beschreibung
DetailedErrors false Sendet detaillierte Ausnahmemeldungen an JavaScript, wenn bei der Verbindung ein Ausnahmefehler auftritt oder wenn ein .NET-Methodenaufruf über JS-Interop eine Ausnahme verursacht.
DisconnectedCircuitMaxRetained 100 Die maximale Anzahl der getrennten Circuits, die sich gleichzeitig im Arbeitsspeicher des Servers befinden können.
DisconnectedCircuitRetentionPeriod 3 Minuten Maximale Zeitspanne, die ein getrennter Circuit im Arbeitsspeicher aufbewahrt wird, bevor er entfernt wird
JSInteropDefaultCallTimeout 1 Minute Maximale Zeitspanne, die der Server wartet, bevor der Aufruf einer asynchronen JavaScript-Funktion durch ein Timeout beendet wird
MaxBufferedUnacknowledgedRenderBatches 10 Maximale Anzahl nicht unbestätigter Renderbatches, die der Server zu einem bestimmten Zeitpunkt pro Circuit im Arbeitsspeicher aufbewahrt, um eine stabile Neuverbindung zu ermöglichen. Wenn die Obergrenze erreicht wird, generiert der Server keine neuen Renderbatches mehr, bis mindestens ein Batch vom Client bestätigt wurde.

Konfigurieren Sie die Optionen in Startup.ConfigureServices mit den Optionsdelegat zu AddServerSideBlazor. Im folgenden Beispiel werden die Standardoptionswerte aus der Tabelle oben zugewiesen. Vergewissern Sie sich, dass Startup.cs den System-Namespace (using System;) verwendet.

Startup.ConfigureServices:

services.AddServerSideBlazor(options =>
{
    options.DetailedErrors = false;
    options.DisconnectedCircuitMaxRetained = 100;
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(3);
    options.JSInteropDefaultCallTimeout = TimeSpan.FromMinutes(1);
    options.MaxBufferedUnacknowledgedRenderBatches = 10;
});

Verwenden Sie HubConnectionContextOptions mit AddHubOptions, um HubConnectionContext zu konfigurieren. Optionsbeschreibungen finden Sie unter SignalR-Konfiguration in ASP.NET Core. Im folgenden Beispiel werden die Standardoptionswerte zugewiesen. Vergewissern Sie sich, dass Startup.cs den System-Namespace (using System;) verwendet.

Startup.ConfigureServices:

services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
        options.EnableDetailedErrors = false;
        options.HandshakeTimeout = TimeSpan.FromSeconds(15);
        options.KeepAliveInterval = TimeSpan.FromSeconds(15);
        options.MaximumParallelInvocationsPerClient = 1;
        options.MaximumReceiveMessageSize = 32 * 1024;
        options.StreamBufferCapacity = 10;
    });

Routenkonfiguration für den Hubendpunkt von Blazor (Blazor Server)

In Startup.Configure rufen Blazor Server-Apps MapBlazorHub für den IEndpointRouteBuilder von UseEndpoints auf, um den Blazor-Hub dem Standardpfad der App zuzuordnen. Das Blazor Server-Skript (blazor.server.js) verweist automatisch auf den durch MapBlazorHub erstellten Endpunkt.

Reflektieren des Verbindungszustands auf der Benutzeroberfläche (Blazor Server)

Wenn der Client erkennt, dass keine Verbindung mehr besteht, wird dem Benutzer eine Standardbenutzeroberfläche angezeigt, während der Client versucht, eine neue Verbindung herzustellen. Wenn die Wiederherstellung der Verbindung fehlschlägt, wird dem Benutzer die Option angezeigt, es noch mal zu versuchen.

Wenn Sie die Benutzeroberfläche anpassen möchten, definieren Sie ein Element mit der id von components-reconnect-modal im <body> der Razor-Seite _Host.cshtml.

Pages/_Host.cshtml:

<div id="components-reconnect-modal">
    ...
</div>

Fügen Sie dem Stylesheet der Website die folgenden CSS-Stile hinzu.

wwwroot/css/site.css:

#components-reconnect-modal {
    display: none;
}

#components-reconnect-modal.components-reconnect-show {
    display: block;
}

In der folgenden Tabelle werden die CSS-Klassen beschrieben, die vom Blazor-Framework auf das components-reconnect-modal-Element angewendet werden.

CSS-Klasse Bedeutung
components-reconnect-show Die Verbindung wurde getrennt. Der Client versucht, die Verbindung wiederherzustellen. Die modale Seite wird angezeigt.
components-reconnect-hide Auf dem Server wird eine aktive Verbindung wiederhergestellt. Die modale Seite wird ausgeblendet.
components-reconnect-failed Die Wiederherstellung der Verbindung ist wahrscheinlich aufgrund eines Netzwerkfehlers fehlgeschlagen. Zum erneuten Herstellen der Verbindung rufen Sie window.Blazor.reconnect() in JavaScript auf.
components-reconnect-rejected Die Wiederherstellung der Verbindung wurde abgelehnt. Der Server wurde zwar erreicht, jedoch hat dieser die Verbindung verweigert. Der Status des Benutzers auf dem Server wurde verworfen. Rufen Sie location.reload() in JavaScript auf, um die App neu zu laden. Dieser Verbindungszustand kann aus folgenden Gründen auftreten:
  • Aufgetretener Absturz auf der serverseitigen Verbindung.
  • Der Client war lange nicht verbunden, sodass der Server den Benutzerstatus verworfen hat. Instanzen der Komponenten des Benutzers werden verworfen.
  • Der Server wird neu gestartet, oder der Workerprozess der App wird wiederverwendet.

Passen Sie die Verzögerung an, bevor die Anzeige einer erneuten Verbindungsherstellung eingeblendet wird, indem Sie die transition-delay-Eigenschaft im CSS der Website für das modale Element festlegen. Im folgenden Beispiel wird die Übergangsverzögerung von 500 ms (Standard) auf 1.000 ms (1 Sekunde) festgelegt.

wwwroot/css/site.css:

#components-reconnect-modal {
    transition: visibility 0s linear 1000ms;
}

Rendermodus (Blazor Server)

Standardmäßig rendern Blazor Server-Apps die Benutzeroberfläche auf dem Server schon vor dem Herstellen der Clientverbindung mit dem Server. Weitere Informationen finden Sie unter Taghilfsprogramm für Komponenten in ASP.NET Core.

Blazor-Start (Blazor Server)

Konfigurieren Sie den manuellen Start der SignalR-Verbindung einer Blazor Server-App in der Datei Pages/_Host.cshtml:

  • Fügen Sie ein autostart="false"-Attribut zum <script>-Tag für das blazor.server.js-Skript hinzu.
  • Fügen Sie ein Skript, das Blazor.start aufruft, nach dem <script>-Tag des blazor.server.js-Skripts und innerhalb des schließenden </body>-Tags ein.

Wenn autostart deaktiviert ist, funktionieren alle Aspekte der App, die nicht von der Verbindung abhängen, normal. So ist beispielsweise das clientseitige Routing betriebsbereit. Aspekte, die von der Verbindung abhängen, sind jedoch erst betriebsbereit, nachdem Blazor.start aufgerufen wurde. Das App-Verhalten ist ohne eine bestehende Verbindung unvorhersehbar. Komponentenmethoden können beispielsweise nicht ausgeführt werden, solange die Verbindung getrennt ist.

Weitere Informationen einschließlich der zur Blazor-Initialisierung, wenn das Dokument bereit ist, und der Verkettung mit einer JS-Zusage finden Sie unter Starten von ASP.NET Core Blazor.

Konfigurieren der SignalR-Clientprotokollierung (Blazor Server)

Übergeben Sie für den Client-Generator das Konfigurationsobjekt configureSignalR, das configureLogging mit der Protokollebene aufruft.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        configureSignalR: function (builder) {
          builder.configureLogging("information");
        }
      });
    </script>
</body>

Im vorherigen Beispiel entspricht information der Protokollebene LogLevel.Information.

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Ändern des Handlers für die Wiederherstellung einer Verbindung (Blazor Server)

Die Verbindungsereignisse des Handlers für die Wiederherstellung einer Verbindung können geändert werden, um benutzerdefinierte Verhaltensweisen zu erzeugen, z. B. für Folgendes:

  • Benachrichtigung an einen Benutzer, wenn die Verbindung unterbrochen wird
  • Ausführen der Protokollierung (vom Client), wenn eine Verbindung besteht

Zum Ändern der Verbindungsereignisse registrieren Sie Rückrufe für die folgenden Verbindungsänderungen:

  • Unterbrochene Verbindungen verwenden onConnectionDown.
  • Hergestellte/wieder hergestellte Verbindungen verwenden onConnectionUp.

Es müssen sowohl onConnectionDown als auch onConnectionUp angegeben werden.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionHandler: {
          onConnectionDown: (options, error) => console.error(error),
          onConnectionUp: () => console.log("Up, up, and away!")
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Anpassen von Anzahl und Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung (Blazor Server)

Legen Sie zum Anpassen der Anzahl und des Intervalls der Wiederholungsversuche zum erneuten Herstellen einer Verbindung die zulässige Anzahl von Wiederholungsversuchen (maxRetries) und den zulässigen Zeitraum in Millisekunden (retryIntervalMilliseconds) für jeden Versuch fest.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionOptions: {
          maxRetries: 3,
          retryIntervalMilliseconds: 2000
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Trennen der Blazor-Verbindung vom Client (Blazor Server)

Standardmäßig wird eine Blazor-Verbindung getrennt, wenn das unload-Ereignis der Seite ausgelöst wird. Um die Verbindung in anderen Szenarien auf dem Client zu trennen, rufen Sie Blazor.disconnect im entsprechenden Ereignishandler auf. Im folgenden Beispiel wird die Verbindung getrennt, wenn die Seite ausgeblendet wird (pagehide-Ereignis):

window.addEventListener('pagehide', () => {
  Blazor.disconnect();
});

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Blazor Server-Verbindungshandler

In Blazor Server kann mithilfe von Code ein Verbindungshandler definiert werden, mit dem Code für Zustandsänderungen einer Benutzerverbindung ausgeführt werden kann. Ein Verbindungshandler wird durch das Ableiten von CircuitHandler und Registrieren der Klasse im Dienstcontainer der App implementiert. Im folgenden Beispiel für einen Verbindungshandlers werden geöffnete SignalR-Verbindungen nachverfolgt.

TrackingCircuitHandler.cs:

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Server.Circuits;

public class TrackingCircuitHandler : CircuitHandler
{
    private HashSet<Circuit> circuits = new();

    public override Task OnConnectionUpAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Add(circuit);

        return Task.CompletedTask;
    }

    public override Task OnConnectionDownAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Remove(circuit);

        return Task.CompletedTask;
    }

    public int ConnectedCircuits => circuits.Count;
}

Verbindungshandler werden mithilfe von DI registriert. Bereichsbezogene Instanzen werden pro Verbindungsinstanz erstellt. Mithilfe von TrackingCircuitHandler aus dem Beispiel oben wird ein Singletondienst erstellt, weil der Zustand aller Verbindungen nachverfolgt werden muss.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<CircuitHandler, TrackingCircuitHandler>();
}

Wenn die Methoden eines benutzerdefinierten Verbindungshandlers einen Ausnahmefehler auslösen, ist dieser Ausnahmefehler für die Blazor Server-Verbindung schwerwiegend. Umschließen Sie den Code in einer oder mehreren try-catch-Anweisungen mit Fehlerbehandlung und -protokollierung, um Ausnahmen im Code oder in aufgerufenen Methoden eines Handlers zu tolerieren.

Wenn eine Verbindung beendet wird, weil ein Benutzer die Verbindung getrennt hat und das Framework den Verbindungsstatus bereinigt, gibt das Framework den DI-Bereich der Verbindung frei. Wenn der Bereich freigegeben wird, werden alle Dienste im Verbindungsbereich verworfen, die System.IDisposable implementieren. Wenn ein DI-Dienst während der Freigabe einen Ausnahmefehler auslöst, protokolliert das Framework die Ausnahme. Weitere Informationen finden Sie unter Abhängigkeitsinjektion in ASP.NET Core Blazor.

Zusätzliche Ressourcen für Blazor Server-Apps

Allgemeine Anleitungen zur Konfiguration von ASP.NET Core SignalR finden Sie in den Artikeln im Bereich Übersicht über ASP.NET Core SignalR der Dokumentation. Informationen zur Konfiguration von SignalR, das einer gehosteten Blazor WebAssemblyLösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende Aushandlung für die Authentifizierung für SignalR (Blazor WebAssembly)

So konfigurieren Sie den zugrunde liegenden SignalR-Client zum Senden von Anmeldeinformationen (z. B. cookie oder HTTP-Authentifizierungsheader):

  • Verwenden Sie SetBrowserRequestCredentials, um Include für ursprungsübergreifende fetch-Anforderungen festzulegen.

    IncludeRequestCredentialsMessageHandler.cs:

    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Components.WebAssembly.Http;
    
    public class IncludeRequestCredentialsMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include);
            return base.SendAsync(request, cancellationToken);
        }
    }
    
  • Wenn eine Hubverbindung erstellt wird, weisen Sie den HttpMessageHandler der Option HttpMessageHandlerFactory zu:

    HubConnectionBuilder hubConnection;
    
    ...
    
    hubConnection = new HubConnectionBuilder()
        .WithUrl(new Uri(NavigationManager.ToAbsoluteUri("/chathub")), options =>
        {
            options.HttpMessageHandlerFactory = innerHandler => 
                new IncludeRequestCredentialsMessageHandler { InnerHandler = innerHandler };
        }).Build();
    

    Im vorherigen Beispiel wird die Hub-Verbindungs-URL mit der absoluten URI-Adresse auf /chathub konfiguriert. Dabei handelt es sich um den im SignalR aus dem Blazor-Tutorial in der Index-Komponente (Pages/Index.razor) verwendeten URL. Der URI kann auch über eine Zeichenfolge wie https://signalr.example.com oder über die Konfiguration festgelegt werden.

Weitere Informationen finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Zusätzliche Ressourcen für Blazor WebAssembly-Apps

Verwenden persistenter Sitzungen für Webfarmhosting (Blazor Server)

Als Reaktion auf die erste Clientanforderung führt die Blazor Server-App ein Prerendering aus, das den Zustand der Benutzeroberfläche auf dem Server festlegt. Versucht der Client, eine SignalR-Verbindung zu erstellen, muss er mit demselben Server erneut eine Verbindung herstellen. Blazor Server-Apps mit mehr als einem Back-End-Server sollten für SignalR-Verbindungen persistente Sitzungen implementieren. Weitere Informationen finden Sie unter Hosten und Bereitstellen von Blazor Server in ASP.NET Core.

Hinweis

Der folgende Fehler wird von einer App ausgelöst, die keine persistenten Sitzungen in einer Webfarm aktiviert hat:

blazor.server.js:1 Uncaught (in promise) Error: Invocation canceled due to the underlying connection being closed. (Nicht abgefangen (in Zusage) Fehler: Der Aufruf wurde abgebrochen, weil die zugrunde liegende Verbindung beendet wurde.)

Azure SignalR Service (Blazor Server)

Wir empfehlen die Verwendung von Azure SignalR Service für in Microsoft Azure gehostete Blazor Server-Apps. Der Dienst arbeitet mit dem Blazor-Hub der App zusammen, um eine Blazor Server-App für eine große Anzahl gleichzeitiger SignalR-Verbindungen hochskalieren zu können. Außerdem tragen die globale Reichweite und die Hochleistungsrechenzentren von SignalR Service erheblich zur Verringerung der geografiebedingten Latenz bei.

Um Unterstützung für Vorabrendern in Azure SignalR Service zu erhalten, konfigurieren Sie die App für die Verwendung von persistenten Sitzungen. Weitere Informationen finden Sie unter Hosten und Bereitstellen von Blazor Server in ASP.NET Core.

Optionen für den Verbindungshandler für Blazor Server-Apps

Konfigurieren Sie die Verbindung Blazor Server mit der in der folgenden Tabelle dargestellten CircuitOptions-Klasse.

Option Standard Beschreibung
DetailedErrors false Sendet detaillierte Ausnahmemeldungen an JavaScript, wenn bei der Verbindung ein Ausnahmefehler auftritt oder wenn ein .NET-Methodenaufruf über JS-Interop eine Ausnahme verursacht.
DisconnectedCircuitMaxRetained 100 Die maximale Anzahl der getrennten Circuits, die sich gleichzeitig im Arbeitsspeicher des Servers befinden können.
DisconnectedCircuitRetentionPeriod 3 Minuten Maximale Zeitspanne, die ein getrennter Circuit im Arbeitsspeicher aufbewahrt wird, bevor er entfernt wird
JSInteropDefaultCallTimeout 1 Minute Maximale Zeitspanne, die der Server wartet, bevor der Aufruf einer asynchronen JavaScript-Funktion durch ein Timeout beendet wird
MaxBufferedUnacknowledgedRenderBatches 10 Maximale Anzahl nicht unbestätigter Renderbatches, die der Server zu einem bestimmten Zeitpunkt pro Circuit im Arbeitsspeicher aufbewahrt, um eine stabile Neuverbindung zu ermöglichen. Wenn die Obergrenze erreicht wird, generiert der Server keine neuen Renderbatches mehr, bis mindestens ein Batch vom Client bestätigt wurde.

Konfigurieren Sie die Optionen in Startup.ConfigureServices mit den Optionsdelegat zu AddServerSideBlazor. Im folgenden Beispiel werden die Standardoptionswerte aus der Tabelle oben zugewiesen. Vergewissern Sie sich, dass Startup.cs den System-Namespace (using System;) verwendet.

Startup.ConfigureServices:

services.AddServerSideBlazor(options =>
{
    options.DetailedErrors = false;
    options.DisconnectedCircuitMaxRetained = 100;
    options.DisconnectedCircuitRetentionPeriod = TimeSpan.FromMinutes(3);
    options.JSInteropDefaultCallTimeout = TimeSpan.FromMinutes(1);
    options.MaxBufferedUnacknowledgedRenderBatches = 10;
});

Verwenden Sie HubConnectionContextOptions mit AddHubOptions, um HubConnectionContext zu konfigurieren. Optionsbeschreibungen finden Sie unter SignalR-Konfiguration in ASP.NET Core. Im folgenden Beispiel werden die Standardoptionswerte zugewiesen. Vergewissern Sie sich, dass Startup.cs den System-Namespace (using System;) verwendet.

Startup.ConfigureServices:

services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromSeconds(30);
        options.EnableDetailedErrors = false;
        options.HandshakeTimeout = TimeSpan.FromSeconds(15);
        options.KeepAliveInterval = TimeSpan.FromSeconds(15);
        options.MaximumParallelInvocationsPerClient = 1;
        options.MaximumReceiveMessageSize = 32 * 1024;
        options.StreamBufferCapacity = 10;
    });

Routenkonfiguration für den Hubendpunkt von Blazor (Blazor Server)

In Startup.Configure rufen Blazor Server-Apps MapBlazorHub für den IEndpointRouteBuilder von UseEndpoints auf, um den Blazor-Hub dem Standardpfad der App zuzuordnen. Das Blazor Server-Skript (blazor.server.js) verweist automatisch auf den durch MapBlazorHub erstellten Endpunkt.

Reflektieren des Verbindungszustands auf der Benutzeroberfläche (Blazor Server)

Wenn der Client erkennt, dass keine Verbindung mehr besteht, wird dem Benutzer eine Standardbenutzeroberfläche angezeigt, während der Client versucht, eine neue Verbindung herzustellen. Wenn die Wiederherstellung der Verbindung fehlschlägt, wird dem Benutzer die Option angezeigt, es noch mal zu versuchen.

Wenn Sie die Benutzeroberfläche anpassen möchten, definieren Sie ein Element mit der id von components-reconnect-modal im <body> der Razor-Seite _Host.cshtml.

Pages/_Host.cshtml:

<div id="components-reconnect-modal">
    ...
</div>

Fügen Sie dem Stylesheet der Website die folgenden CSS-Stile hinzu.

wwwroot/css/site.css:

#components-reconnect-modal {
    display: none;
}

#components-reconnect-modal.components-reconnect-show {
    display: block;
}

In der folgenden Tabelle werden die CSS-Klassen beschrieben, die vom Blazor-Framework auf das components-reconnect-modal-Element angewendet werden.

CSS-Klasse Bedeutung
components-reconnect-show Die Verbindung wurde getrennt. Der Client versucht, die Verbindung wiederherzustellen. Die modale Seite wird angezeigt.
components-reconnect-hide Auf dem Server wird eine aktive Verbindung wiederhergestellt. Die modale Seite wird ausgeblendet.
components-reconnect-failed Die Wiederherstellung der Verbindung ist wahrscheinlich aufgrund eines Netzwerkfehlers fehlgeschlagen. Zum erneuten Herstellen der Verbindung rufen Sie window.Blazor.reconnect() in JavaScript auf.
components-reconnect-rejected Die Wiederherstellung der Verbindung wurde abgelehnt. Der Server wurde zwar erreicht, jedoch hat dieser die Verbindung verweigert. Der Status des Benutzers auf dem Server wurde verworfen. Rufen Sie location.reload() in JavaScript auf, um die App neu zu laden. Dieser Verbindungszustand kann aus folgenden Gründen auftreten:
  • Aufgetretener Absturz auf der serverseitigen Verbindung.
  • Der Client war lange nicht verbunden, sodass der Server den Benutzerstatus verworfen hat. Instanzen der Komponenten des Benutzers werden verworfen.
  • Der Server wird neu gestartet, oder der Workerprozess der App wird wiederverwendet.

Rendermodus (Blazor Server)

Standardmäßig rendern Blazor Server-Apps die Benutzeroberfläche auf dem Server schon vor dem Herstellen der Clientverbindung mit dem Server. Weitere Informationen finden Sie unter Taghilfsprogramm für Komponenten in ASP.NET Core.

Blazor-Start (Blazor Server)

Konfigurieren Sie den manuellen Start der SignalR-Verbindung einer Blazor Server-App in der Datei Pages/_Host.cshtml:

  • Fügen Sie ein autostart="false"-Attribut zum <script>-Tag für das blazor.server.js-Skript hinzu.
  • Fügen Sie ein Skript, das Blazor.start aufruft, nach dem <script>-Tag des blazor.server.js-Skripts und innerhalb des schließenden </body>-Tags ein.

Wenn autostart deaktiviert ist, funktionieren alle Aspekte der App, die nicht von der Verbindung abhängen, normal. So ist beispielsweise das clientseitige Routing betriebsbereit. Aspekte, die von der Verbindung abhängen, sind jedoch erst betriebsbereit, nachdem Blazor.start aufgerufen wurde. Das App-Verhalten ist ohne eine bestehende Verbindung unvorhersehbar. Komponentenmethoden können beispielsweise nicht ausgeführt werden, solange die Verbindung getrennt ist.

Weitere Informationen einschließlich der zur Blazor-Initialisierung, wenn das Dokument bereit ist, und der Verkettung mit einer JS-Zusage finden Sie unter Starten von ASP.NET Core Blazor.

Konfigurieren der SignalR-Clientprotokollierung (Blazor Server)

Übergeben Sie für den Client-Generator das Konfigurationsobjekt configureSignalR, das configureLogging mit der Protokollebene aufruft.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        configureSignalR: function (builder) {
          builder.configureLogging("information");
        }
      });
    </script>
</body>

Im vorherigen Beispiel entspricht information der Protokollebene LogLevel.Information.

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Ändern des Handlers für die Wiederherstellung einer Verbindung (Blazor Server)

Die Verbindungsereignisse des Handlers für die Wiederherstellung einer Verbindung können geändert werden, um benutzerdefinierte Verhaltensweisen zu erzeugen, z. B. für Folgendes:

  • Benachrichtigung an einen Benutzer, wenn die Verbindung unterbrochen wird
  • Ausführen der Protokollierung (vom Client), wenn eine Verbindung besteht

Zum Ändern der Verbindungsereignisse registrieren Sie Rückrufe für die folgenden Verbindungsänderungen:

  • Unterbrochene Verbindungen verwenden onConnectionDown.
  • Hergestellte/wieder hergestellte Verbindungen verwenden onConnectionUp.

Es müssen sowohl onConnectionDown als auch onConnectionUp angegeben werden.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionHandler: {
          onConnectionDown: (options, error) => console.error(error),
          onConnectionUp: () => console.log("Up, up, and away!")
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Anpassen von Anzahl und Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung (Blazor Server)

Legen Sie zum Anpassen der Anzahl und des Intervalls der Wiederholungsversuche zum erneuten Herstellen einer Verbindung die zulässige Anzahl von Wiederholungsversuchen (maxRetries) und den zulässigen Zeitraum in Millisekunden (retryIntervalMilliseconds) für jeden Versuch fest.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      Blazor.start({
        reconnectionOptions: {
          maxRetries: 3,
          retryIntervalMilliseconds: 2000
        }
      });
    </script>
</body>

Weitere Informationen zum Start von Blazor finden Sie unter Starten von ASP.NET Core Blazor.

Blazor Server-Verbindungshandler

In Blazor Server kann mithilfe von Code ein Verbindungshandler definiert werden, mit dem Code für Zustandsänderungen einer Benutzerverbindung ausgeführt werden kann. Ein Verbindungshandler wird durch das Ableiten von CircuitHandler und Registrieren der Klasse im Dienstcontainer der App implementiert. Im folgenden Beispiel für einen Verbindungshandlers werden geöffnete SignalR-Verbindungen nachverfolgt.

TrackingCircuitHandler.cs:

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Server.Circuits;

public class TrackingCircuitHandler : CircuitHandler
{
    private HashSet<Circuit> circuits = new HashSet<Circuit>();

    public override Task OnConnectionUpAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Add(circuit);

        return Task.CompletedTask;
    }

    public override Task OnConnectionDownAsync(Circuit circuit, 
        CancellationToken cancellationToken)
    {
        circuits.Remove(circuit);

        return Task.CompletedTask;
    }

    public int ConnectedCircuits => circuits.Count;
}

Verbindungshandler werden mithilfe von DI registriert. Bereichsbezogene Instanzen werden pro Verbindungsinstanz erstellt. Mithilfe von TrackingCircuitHandler aus dem Beispiel oben wird ein Singletondienst erstellt, weil der Zustand aller Verbindungen nachverfolgt werden muss.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddSingleton<CircuitHandler, TrackingCircuitHandler>();
}

Wenn die Methoden eines benutzerdefinierten Verbindungshandlers einen Ausnahmefehler auslösen, ist dieser Ausnahmefehler für die Blazor Server-Verbindung schwerwiegend. Umschließen Sie den Code in einer oder mehreren try-catch-Anweisungen mit Fehlerbehandlung und -protokollierung, um Ausnahmen im Code oder in aufgerufenen Methoden eines Handlers zu tolerieren.

Wenn eine Verbindung beendet wird, weil ein Benutzer die Verbindung getrennt hat und das Framework den Verbindungsstatus bereinigt, gibt das Framework den DI-Bereich der Verbindung frei. Wenn der Bereich freigegeben wird, werden alle Dienste im Verbindungsbereich verworfen, die System.IDisposable implementieren. Wenn ein DI-Dienst während der Freigabe einen Ausnahmefehler auslöst, protokolliert das Framework die Ausnahme. Weitere Informationen finden Sie unter Abhängigkeitsinjektion in ASP.NET Core Blazor.

Zusätzliche Ressourcen für Blazor Server-Apps