Leitfaden für ASP.NET Core Blazor SignalR

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende SignalR-Aushandlung für die Authentifizierung

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 hubConnecton;
    
    ...
    
    hubConnecton = 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

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

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Optionen für Verbindungshandler

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 Blazor-Hubendpunkt

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

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 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 Steht für…
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

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 Hilf hilft für Komponententags in ASP.NET Core.

Blazor Startup

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 ASP.NET Core Blazor: Startup.

Konfigurieren der SignalR-Clientprotokollierung

Ü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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ändern des Handlers für die Wiederherstellung einer Verbindung

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Passen Sie die Anzahl und das Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung an.

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ausblenden oder Ersetzen der Anzeige einer erneuten Verbindung

Legen Sie zum Ausblenden der Anzeige einer erneuten Verbindungsherstellung _reconnectionDisplay des Handlers für die erneute Verbindungsherstellung auf ein leeres Objekt ({} oder new Object()) fest.

Pages/_Layout.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      window.addEventListener('beforeunload', function () {
        Blazor.defaultReconnectionHandler._reconnectionDisplay = {};
      });

      Blazor.start();
    </script>
</body>

Um die Anzeige einer erneuten Verbindung zu ersetzen, legen Sie im vorherigen Beispiel _reconnectionDisplay auf das anzuzeigende Element fest:

Blazor.defaultReconnectionHandler._reconnectionDisplay = 
  document.getElementById("{ELEMENT ID}");

Der Platzhalter {ELEMENT ID} ist die ID des HTML-Elements, das angezeigt werden soll.

Weitere Informationen zum Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

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

Trennen der Blazor-Verbindung mit dem Client

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

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.

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.

Azure SignalR Service

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 ASP.NET Core Blazor Server.

Zusätzliche Ressourcen

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende SignalR-Aushandlung für die Authentifizierung

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 hubConnecton;
    
    ...
    
    hubConnecton = 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

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

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Optionen für Verbindungshandler

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 Blazor-Hubendpunkt

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

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 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 Steht für…
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

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 Hilf hilft für Komponententags in ASP.NET Core.

Blazor Startup

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 ASP.NET Core Blazor: Startup.

Konfigurieren der SignalR-Clientprotokollierung

Ü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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ändern des Handlers für die Wiederherstellung einer Verbindung

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Passen Sie die Anzahl und das Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung an.

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ausblenden oder Ersetzen der Anzeige einer erneuten Verbindung

Legen Sie zum Ausblenden der Anzeige einer erneuten Verbindungsherstellung _reconnectionDisplay des Handlers für die erneute Verbindungsherstellung auf ein leeres Objekt ({} oder new Object()) fest.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      window.addEventListener('beforeunload', function () {
        Blazor.defaultReconnectionHandler._reconnectionDisplay = {};
      });

      Blazor.start();
    </script>
</body>

Um die Anzeige einer erneuten Verbindung zu ersetzen, legen Sie im vorherigen Beispiel _reconnectionDisplay auf das anzuzeigende Element fest:

Blazor.defaultReconnectionHandler._reconnectionDisplay = 
  document.getElementById("{ELEMENT ID}");

Der Platzhalter {ELEMENT ID} ist die ID des HTML-Elements, das angezeigt werden soll.

Weitere Informationen zum Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

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

Trennen der Blazor-Verbindung mit dem Client

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

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.

Azure SignalR Service

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 ASP.NET Core Blazor Server.

Zusätzliche Ressourcen

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Ursprungsübergreifende SignalR-Aushandlung für die Authentifizierung

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 hubConnecton;
    
    ...
    
    hubConnecton = 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

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

Allgemeine Anleitungen zur ASP.NET Core SignalR-Konfiguration finden Sie in den Artikeln im Einführung in ASP.NET Core SignalR-Bereich der Dokumentation. Informationen zum Konfigurieren von SignalR, das zu einer gehosteten Blazor WebAssembly-Lösung hinzugefügt wurde, finden Sie unter SignalR-Konfiguration in ASP.NET Core.

Optionen für Verbindungshandler

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 Blazor-Hubendpunkt

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

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 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 Steht für…
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

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 Hilf hilft für Komponententags in ASP.NET Core.

Blazor Startup

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 ASP.NET Core Blazor: Startup.

Konfigurieren der SignalR-Clientprotokollierung

Ü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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ändern des Handlers für die Wiederherstellung einer Verbindung

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Passen Sie die Anzahl und das Intervall der Wiederholungsversuche zum erneuten Herstellen einer Verbindung an.

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 Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

Ausblenden oder Ersetzen der Anzeige einer erneuten Verbindung

Legen Sie zum Ausblenden der Anzeige einer erneuten Verbindungsherstellung _reconnectionDisplay des Handlers für die erneute Verbindungsherstellung auf ein leeres Objekt ({} oder new Object()) fest.

Pages/_Host.cshtml:

<body>
    ...

    <script src="_framework/blazor.server.js" autostart="false"></script>
    <script>
      window.addEventListener('beforeunload', function () {
        Blazor.defaultReconnectionHandler._reconnectionDisplay = {};
      });

      Blazor.start();
    </script>
</body>

Um die Anzeige einer erneuten Verbindung zu ersetzen, legen Sie im vorherigen Beispiel _reconnectionDisplay auf das anzuzeigende Element fest:

Blazor.defaultReconnectionHandler._reconnectionDisplay = 
  document.getElementById("{ELEMENT ID}");

Der Platzhalter {ELEMENT ID} ist die ID des HTML-Elements, das angezeigt werden soll.

Weitere Informationen zum Blazor-Start finden Sie unter ASP.NET Core Blazor: Startup.

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.

Azure SignalR Service

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 ASP.NET Core Blazor Server.

Zusätzliche Ressourcen