SignalR-Konfiguration in ASP.NET Core

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Startup.ConfigureServices hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Durch das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) steigen.
MaximumParallelInvocationsPerClient 1 Die maximale Anzahl von Hubmethoden, die jeder Client parallel aufrufen kann, bevor er in die Warteschlange gestellt wird.
DisableImplicitFromServicesParameters false Die Argumente der Hubmethode werden nach Möglichkeit von DI aufgelöst.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Program.cs bereitgestellt wird.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Program.cs übergeben wird.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 64 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 64 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.
MinimumProtocolVersion 0 Geben Sie die Mindestversion des Aushandlungsprotokolls an. Diese wird verwendet, um Clients auf neuere Versionen zu beschränken.
CloseOnAuthenticationExpiration false Legen Sie diese Option fest, um die Nachverfolgung des Authentifizierungsablaufs zu aktivieren, wodurch Verbindungen beendet werden, wenn ein Token abläuft.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten:

Option Standardwert Beschreibung
WithServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für Serveraktivitäten und wird direkt auf HubConnectionBuilder festgelegt. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie das Keepalive-Intervall (WithKeepAliveInterval) des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake und ist für das HubConnection-Objekt selbst verfügbar. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
WithKeepAliveInterval 15 Sekunden Bestimmt das Intervall, in dem der Client Ping-Nachrichten sendet und wird direkt auf HubConnectionBuilder festgelegt. Diese Einstellung ermöglicht dem Server, das Erkennen harter Verbindungsabbrüche, z. B. wenn ein Client seinen Computer vom Netzwerk trennt. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Das folgende Beispiel zeigt Werte, die doppelt so hoch sind wie die Standardwerte:

var builder = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
    .WithServerTimeout(TimeSpan.FromSeconds(60))
    .WithKeepAliveInterval(TimeSpan.FromSeconds(30))
    .Build();

builder.On<string, string>("ReceiveMessage", (user, message) => ...

await builder.StartAsync();

Konfigurieren der zustandsbehafteten Verbindungswiederherstellung

Die zustandsbehaftete SignalR-Wiederherstellung der Verbindung reduziert die wahrgenommene Ausfallzeit von Clients, die eine vorübergehende Unterbrechung in ihrer Netzwerkverbindung aufweisen, z. B. beim Wechsel von Netzwerkverbindungen oder einem kurzen temporären Zugriffsverlust.

Die zustandsbehaftete Wiederherstellung der Verbindung ermöglicht Folgendes:

  • Vorübergehendes Puffern von Daten auf dem Server und Client.
  • Bestätigen von Nachrichten, die sowohl vom Server als auch vom Client empfangen werden (ACK-ing).
  • Es wird erkannt, wenn wieder eine Verbindung besteht, und Nachrichten werden wiedergegeben, die möglicherweise gesendet wurden, während die Verbindung unterbrochen war.

Die zustandsbehaftete Verbindungswiederherstellung ist in ASP.NET Core 8.0 und höher verfügbar.

Aktivieren Sie die zustandsbehaftete Verbindungswiederherstellung sowohl am Serverhubendpunkt als auch auf dem Client:

  • Aktualisieren Sie die Konfiguration des Serverhub-Endpunkts, um die Option AllowStatefulReconnects zu aktivieren:

    app.MapHub<MyHub>("/hubName", options =>
    {
        options.AllowStatefulReconnects = true;
    });
    

    Optional kann die vom Server zulässige maximale Puffergröße in Bytes global oder für einen bestimmten Hub mit der Option StatefulReconnectBufferSize festgelegt werden:

    Die global festgelegte Option StatefulReconnectBufferSize:

    builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
    

    Die für einen bestimmten Hub festgelegte Option StatefulReconnectBufferSize:

    builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
    

    Die Option StatefulReconnectBufferSize ist optional. Die Standardeinstellung sind 100.000 Bytes.

  • Aktualisieren Sie den JavaScript- oder TypeScript-Clientcode, um die Option withStatefulReconnect zu aktivieren:

    const builder = new signalR.HubConnectionBuilder()
      .withUrl("/hubname")
      .withStatefulReconnect({ bufferSize: 1000 });  // Optional, defaults to 100,000
    const connection = builder.build();
    

    Die Option bufferSize ist optional. Die Standardeinstellung sind 100.000 Bytes.

  • Aktualisieren Sie den .NET-Clientcode, um die Option WithStatefulReconnect zu aktivieren:

      var builder = new HubConnectionBuilder()
          .WithUrl("<hub url>")
          .WithStatefulReconnect();
      builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000);
      var hubConnection = builder.Build();
    

    Die Option StatefulReconnectBufferSize ist optional. Die Standardeinstellung sind 100.000 Bytes.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.
ApplicationMaxBufferSize 1 MB Die maximale Anzahl der vom Server empfangenen Bytes, die der Client puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Client, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 1 MB Die maximale Anzahl von Bytes, die von der Benutzeranwendung gesendet werden, die der Client vor der Beobachtung eines Gegendrucks puffert. Wenn Sie diesen Wert erhöhen, kann der Client größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

JSDie Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden, die nach AddSignalR in Ihrer Startup.ConfigureServices-Methode hinzugefügt werden kann. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerSettings-Eigenschaft dieses Objekts ist ein Json.NET JsonSerializerSettings-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Json.NET-Dokumentation.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es „PascalCase“-Eigenschaftsnamen anstelle der camelCase-Standardnamen verwendet, verwenden Sie den folgenden Code in Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Startup.ConfigureServices bereitgestellt wird.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Startup.Configure übergeben wird.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 32 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten zu empfangen, kann sich jedoch negativ auf den Arbeitsspeicherverbrauch auswirken.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
TransportMaxBufferSize 32 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten zu senden, kann sich jedoch negativ auf den Arbeitsspeicherverbrauch auswirken.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

JSDie Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden, die nach AddSignalR in Ihrer Startup.ConfigureServices-Methode hinzugefügt werden kann. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerSettings-Eigenschaft dieses Objekts ist ein Json.NET JsonSerializerSettings-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Json.NET-Dokumentation.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es „PascalCase“-Eigenschaftsnamen anstelle der camelCase-Standardnamen verwendet, verwenden Sie den folgenden Code in Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Startup.ConfigureServices bereitgestellt wird.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Startup.Configure übergeben wird.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 32 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten zu empfangen, kann sich jedoch negativ auf den Arbeitsspeicherverbrauch auswirken.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
TransportMaxBufferSize 32 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten zu senden, kann sich jedoch negativ auf den Arbeitsspeicherverbrauch auswirken.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Startup.ConfigureServices hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) erhöhen.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Startup.ConfigureServices bereitgestellt wird.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Startup.Configure übergeben wird.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 32 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
TransportMaxBufferSize 32 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Startup.ConfigureServices hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) erhöhen.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Startup.ConfigureServices bereitgestellt wird.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Startup.Configure übergeben wird.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 32 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
TransportMaxBufferSize 32 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.
MinimumProtocolVersion 0 Geben Sie die Mindestversion des Aushandlungsprotokolls an. Diese wird verwendet, um Clients auf neuere Versionen zu beschränken.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Startup.ConfigureServices hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Startup.ConfigureServices:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) erhöhen.
MaximumParallelInvocationsPerClient 1 Die maximale Anzahl von Hubmethoden, die jeder Client parallel aufrufen kann, bevor er in die Warteschlange gestellt wird.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Startup.ConfigureServices bereitgestellt wird.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Startup.Configure übergeben wird.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 32 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
TransportMaxBufferSize 32 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.
MinimumProtocolVersion 0 Geben Sie die Mindestversion des Aushandlungsprotokolls an. Diese wird verwendet, um Clients auf neuere Versionen zu beschränken.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Program.cs hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) erhöhen.
MaximumParallelInvocationsPerClient 1 Die maximale Anzahl von Hubmethoden, die jeder Client parallel aufrufen kann, bevor er in die Warteschlange gestellt wird.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Program.cs bereitgestellt wird.

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Program.cs übergeben wird.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 64 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 64 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.
MinimumProtocolVersion 0 Geben Sie die Mindestversion des Aushandlungsprotokolls an. Diese wird verwendet, um Clients auf neuere Versionen zu beschränken.
CloseOnAuthenticationExpiration false Legen Sie diese Option fest, um die Nachverfolgung des Authentifizierungsablaufs zu aktivieren, wodurch Verbindungen geschlossen werden, wenn ein Token abläuft.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.
ApplicationMaxBufferSize 1 MB Die maximale Anzahl der vom Server empfangenen Bytes, die der Client puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Client, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 1 MB Die maximale Anzahl von Bytes, die von der Benutzeranwendung gesendet werden, die der Client vor der Beobachtung eines Gegendrucks puffert. Wenn Sie diesen Wert erhöhen, kann der Client größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen

JSON/MessagePack-Serialisierungsoptionen

ASP.NET Core SignalR unterstützt zwei Protokolle für die Codierung von Nachrichten: JSON und MessagePack. Jedes Protokoll verfügt über Konfigurationsoptionen für die Serialisierung.

Die JSON-Serialisierung kann auf dem Server mithilfe der AddJsonProtocol-Erweiterungsmethode konfiguriert werden. AddJsonProtocol kann nach AddSignalR in Startup.ConfigureServices hinzugefügt werden. Die Methode AddJsonProtocol übernimmt einen Delegaten, der ein options-Objekt empfängt. Die PayloadSerializerOptions-Eigenschaft dieses Objekts ist ein System.Text.JsonJsonSerializerOptions-Objekt, das zur Konfiguration der Serialisierung von Argumenten und Rückgabewerten verwendet werden kann. Weitere Informationen finden Sie in der Dokumentation zu System.Text.Json.

Um z. B. das Serialisierungsmodul so zu konfigurieren, dass es die Groß- und Kleinschreibung von Eigenschaftsnamen nicht ändert, anstatt die standardmäßigen camelCase-Namen zu verwenden, nutzen Sie den folgenden Code in Program.cs:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

Im .NET-Client existiert die gleiche AddJsonProtocol-Erweiterungsmethode für HubConnectionBuilder. Der Namespace Microsoft.Extensions.DependencyInjection muss importiert werden, um die Erweiterungsmethode aufzulösen:

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

Hinweis

Es ist derzeit nicht möglich, die JSON-Serialisierung im JavaScript-Client zu konfigurieren.

Wechsel zu Newtonsoft.Json

Wenn Sie Features von Newtonsoft.Json benötigen, die in System.Text.Json nicht unterstützt werden, finden Sie weitere Informationen unter Wechsel zu Newtonsoft.Json.

MessagePack-Serialisierungsoptionen

Die MessagePack-Serialisierung kann konfiguriert werden, indem ein Delegat für den AddMessagePackProtocol-Aufruf bereitgestellt wird. Weitere Informationen finden Sie unter MessagePack in SignalR.

Hinweis

Es ist derzeit nicht möglich, die MessagePack-Serialisierung im JavaScript-Client zu konfigurieren.

Konfigurieren von Serveroptionen

In der folgenden Tabelle werden die Optionen für die Konfiguration von SignalR-Hubs beschrieben:

Option Standardwert Beschreibung
ClientTimeoutInterval 30 Sekunden Der Server geht davon aus, dass der Client nicht mehr verbunden ist, wenn er in diesem Intervall keine Nachricht (einschließlich Keepalive) erhalten hat. Aufgrund der Art der Implementierung kann es länger als dieses Timeoutintervall dauern, bis der Client als getrennt markiert wird. Der empfohlene Wert ist das Doppelte des KeepAliveInterval-Werts.
HandshakeTimeout 15 Sekunden Wenn der Client innerhalb dieses Zeitintervalls keine erste Handshakenachricht sendet, wird die Verbindung geschlossen. Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Wenn der Server innerhalb dieses Intervalls keine Nachricht gesendet hat, wird automatisch eine Ping-Nachricht gesendet, um die Verbindung offen zu halten. Wenn Sie KeepAliveInterval ändern, ändern Sie die ServerTimeout- oder serverTimeoutInMilliseconds-Einstellung auf dem Client. Der empfohlene ServerTimeout- oder serverTimeoutInMilliseconds-Wert ist das Doppelte des KeepAliveInterval Werts.
SupportedProtocols Alle installierten Protokolle Von diesem Hub unterstützte Protokolle Standardmäßig sind alle auf dem Server registrierten Protokolle erlaubt. Protokolle können aus dieser Liste entfernt werden, um bestimmte Protokolle für einzelne Hubs zu deaktivieren.
EnableDetailedErrors false Bei true werden detaillierte Ausnahmemeldungen an Clients zurückgegeben, wenn eine Ausnahme in einer Hubmethode ausgelöst wird. Der Standardwert ist false, da diese Ausnahmemeldungen vertrauliche Informationen enthalten können.
StreamBufferCapacity 10 Die maximale Anzahl von Elementen, die für Datenströme von Clientuploads gepuffert werden können. Wenn dieser Grenzwert erreicht ist, wird die Verarbeitung von Aufrufen blockiert, bis der Server Datenstromelemente verarbeitet hat.
MaximumReceiveMessageSize 32 KB Maximale Größe einer einzelnen eingehenden Hubnachricht. Das Erhöhen des Werts kann das Risiko von Denial-of-Service-Angriffen (DoS) erhöhen.
MaximumParallelInvocationsPerClient 1 Die maximale Anzahl von Hubmethoden, die jeder Client parallel aufrufen kann, bevor er in die Warteschlange gestellt wird.
DisableImplicitFromServicesParameters false Die Argumente der Hubmethode werden nach Möglichkeit von DI aufgelöst.

Optionen können für alle Hubs konfiguriert werden, indem ein Optionsdelegat für den AddSignalR-Aufruf in Program.cs bereitgestellt wird.

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

Optionen für einen einzelnen Hub haben Vorrang vor den globalen Optionen in AddSignalR und können mit AddHubOptions konfiguriert werden:

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

Erweiterte HTTP-Konfigurationsoptionen

Verwenden Sie HttpConnectionDispatcherOptions, um erweiterte Einstellungen in Bezug auf Datentransporte und Speicherpufferverwaltung festzulegen. Diese Optionen werden konfiguriert, indem ein Delegat an MapHub in Program.cs übergeben wird.

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

In der folgenden Tabelle werden die Optionen für die Konfiguration der erweiterten HTTP-Optionen von ASP.NET Core SignalR beschrieben:

Option Standardwert Beschreibung
ApplicationMaxBufferSize 64 KB Die maximale Anzahl der vom Client empfangenen Bytes, die der Server puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Server, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 64 KB Die maximale Anzahl der von der App gesendeten Bytes, die der Server puffert, bevor er einen Gegendruck feststellt. Wenn Sie diesen Wert erhöhen, kann der Server größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.
AuthorizationData Automatisch erfasste Daten aus den Authorize-Attributen, die auf die Hubklasse angewendet werden. Eine Liste von IAuthorizeData-Objekten, die verwendet wird, um festzustellen, ob ein Client berechtigt ist, eine Verbindung mit dem Hub herzustellen.
Transports Alle Transporte sind aktiviert. Eine Bitflags-Enumeration mit HttpTransportType-Werten, die die Transporte einschränken kann, die ein Client für die Verbindung verwenden kann.
LongPolling Siehe unten. Zusätzliche Optionen, die speziell für den Transport langer Abrufe gelten.
WebSockets Siehe unten. Zusätzliche Optionen speziell für den WebSockets-Transport.
MinimumProtocolVersion 0 Geben Sie die Mindestversion des Aushandlungsprotokolls an. Diese wird verwendet, um Clients auf neuere Versionen zu beschränken.
CloseOnAuthenticationExpiration false Legen Sie diese Option fest, um die Nachverfolgung des Authentifizierungsablaufs zu aktivieren, wodurch Verbindungen geschlossen werden, wenn ein Token abläuft.

Der Transport langer Abrufe verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft LongPolling konfiguriert werden können:

Option Standardwert Beschreibung
PollTimeout 90 Sekunden Die maximale Zeitspanne, die der Server auf eine Nachricht an den Client wartet, bevor er eine einzelne Abrufanforderung beendet. Eine Verringerung dieses Werts veranlasst den Client, häufiger neue Abrufanforderungen zu stellen.

Der WebSocket-Transport verfügt über zusätzliche Optionen, die mithilfe der Eigenschaft WebSockets konfiguriert werden können:

Option Standardwert Beschreibung
CloseTimeout 5 Sekunden Wenn der Client nach dem Schließen des Servers innerhalb dieses Zeitintervalls nicht geschlossen werden kann, wird die Verbindung beendet.
SubProtocolSelector null Ein Delegat, der verwendet werden kann, um den Sec-WebSocket-Protocol-Header auf einen benutzerdefinierten Wert festzulegen. Der Delegat erhält die vom Client angeforderten Werte als Eingabe und soll den gewünschten Wert zurückgeben.

Konfigurieren von Clientoptionen

Clientoptionen können für den Typ HubConnectionBuilder konfiguriert werden (verfügbar in den .NET- und JavaScript-Clients). Er ist auch im Java-Client verfügbar, aber die Unterklasse HttpHubConnectionBuilder enthält die Konfigurationsoptionen für den Builder, ebenso wie die HubConnection selbst.

Konfigurieren der Protokollierung

Die Protokollierung wird im .NET-Client mithilfe der Methode ConfigureLogging konfiguriert. Anbieter und Filter für die Protokollierung können auf die gleiche Weise registriert werden wie auf dem Server. Weitere Informationen finden Sie in der Dokumentation zum Protokollieren in ASP.NET Core.

Hinweis

Zum Registrieren von Protokollierungsanbietern müssen Sie die erforderlichen Pakete installieren. Eine vollständige Liste finden Sie im Abschnitt Integrierte Protokollierungsanbieter in den Dokumentationen.

Um z. B. die Konsolenprotokollierung zu aktivieren, installieren Sie das Microsoft.Extensions.Logging.Console-NuGet-Paket. Rufen Sie die AddConsole-Erweiterungsmethode auf:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

Im JavaScript-Client gibt es eine ähnliche configureLogging-Methode. Geben Sie einen LogLevel-Wert an, der die Mindeststufe der zu erzeugenden Protokollmeldungen angibt. Die Protokolle werden in das Konsolenfenster des Browsers geschrieben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

Anstelle eines LogLevel-Werts können Sie auch einen string-Wert angeben, der einen Namen für die Protokollstufe darstellt. Dies ist nützlich bei der Konfiguration der SignalR-Protokollierung in Umgebungen, in denen Sie keinen Zugriff auf die LogLevel-Konstanten haben.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

In der folgenden Tabelle finden Sie die verfügbaren Protokollstufen. Der Wert, den Sie für configureLogging angeben, legt die minimale Protokollstufe fest, die protokolliert wird. Meldungen, die auf dieser Stufe oder den in der Tabelle aufgeführten Stufen danach protokolliert werden, werden protokolliert.

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoorinformation LogLevel.Information
warnorwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Hinweis

Um die Protokollierung vollständig zu deaktivieren, geben Sie signalR.LogLevel.None in der configureLogging-Methode an.

Weitere Informationen zur Protokollierung finden Sie unter SignalR-Diagnose: Dokumentation.

Der SignalR Java-Client verwendet die SLF4J-Bibliothek für die Protokollierung. Es handelt sich um eine allgemeine Protokollierungs-API, mit der Benutzer der Bibliothek ihre eigene spezifische Protokollierungsimplementierung wählen können, indem sie eine bestimmte Protokollierungsabhängigkeit einbinden. Der folgende Codeschnipsel zeigt die Verwendung von java.util.logging mit dem SignalR-Java-Client.

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

Wenn Sie die Protokollierung in Ihren Abhängigkeiten nicht konfigurieren, lädt SLF4J eine standardmäßige nicht vorgangsspezifische Protokollierung mit der folgenden Warnmeldung:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Diese kann gefahrlos ignoriert werden.

Konfigurieren zulässiger Transporte

Die von SignalR verwendeten Transporte können mit dem WithUrl-Aufruf (withUrl in JavaScript) konfiguriert werden. Ein bitweises ODER der Werte von HttpTransportType kann verwendet werden, um den Client darauf zu beschränken, nur die angegebenen Transporte zu verwenden. Alle Transporte sind standardmäßig aktiviert.

Wenn Sie z. B. den Transport der vom Server gesendeten Ereignisse deaktivieren, aber WebSockets-Verbindungen und Verbindungen für lange Abrufe zulassen möchten:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

Im JavaScript-Client werden die Transporte konfiguriert, indem Sie das Feld transport für das bereitgestellte Optionsobjekt auf withUrl festlegen:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

In dieser Version des Java-Clients ist WebSockets der einzige verfügbare Transport.

Im Java-Client wird der Transport mit der Methode withTransport auf der Seite HttpHubConnectionBuilder ausgewählt. Der Java-Client verwendet standardmäßig den WebSockets-Transport.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

Hinweis

Der SignalR Java-Client unterstützt noch keinen Transportfallback.

Konfigurieren der Bearerauthentifizierung

Um Authentifizierungsdaten zusammen mit SignalR-Anforderungen bereitzustellen, verwenden Sie die Option AccessTokenProvider (accessTokenFactory in JavaScript), um eine Funktion anzugeben, die das gewünschte Zugriffstoken zurückgibt. Im .NET-Client wird dieses Zugriffstoken als HTTP-Token für die „Bearerauthentifizierung“ übergeben (mithilfe des Authorization-Headers mit einem Typ von Bearer). Im JavaScript-Client wird das Zugriffstoken als Bearertoken verwendet, außer in einigen wenigen Fällen, in denen die Browser-APIs die Möglichkeit zur Anwendung von Headern einschränken (insbesondere in vom Server gesendeten Ereignissen und WebSockets-Anforderungen). In diesen Fällen wird das Zugriffstoken als Abfragezeichenfolgenwert access_token bereitgestellt.

Im .NET-Client kann die Option AccessTokenProvider mithilfe des Optionsdelegaten in WithUrl angegeben werden:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

Im JavaScript-Client wird das Zugriffstoken konfiguriert, indem das Feld accessTokenFactory für das Optionsobjekt in withUrl festgelegt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

In dem SignalR Java-Client können Sie ein Bearertoken konfigurieren, das Sie zur Authentifizierung verwenden, indem Sie dem HttpHubConnectionBuilder eine Zugriffstokenfactory zur Verfügung stellen. Verwenden Sie withAccessTokenFactory, um RxJavaSingle<String> bereitzustellen. Mit einem Aufruf von Single.defer können Sie Logik schreiben, um Zugriffstoken für Ihren Client zu erstellen.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

Konfigurieren von Timeout- und Keepalive-Optionen

Zusätzliche Optionen für die Konfiguration von Timeout- und Keepalive-Verhalten sind für das HubConnection-Objekt selbst verfügbar:

Option Standardwert Beschreibung
ServerTimeout 30 Sekunden (30.000 Millisekunden) Timeout für die Serveraktivität. Wenn der Server in diesem Intervall keine Nachricht gesendet hat, betrachtet der Client den Server als nicht verbunden und löst das Ereignis Closed (onclose in JavaScript) aus. Dieser Wert muss groß genug sein, damit eine Ping-Nachricht vom Server gesendet und vom Client innerhalb des Timeoutintervalls empfangen werden kann. Empfohlen wird eine Zahl, die mindestens doppelt so hoch ist wie der KeepAliveInterval-Wert des Servers, um Zeit für das Eintreffen von Pings zu haben.
HandshakeTimeout 15 Sekunden Timeout für den anfänglichen Serverhandshake. Wenn der Server in diesem Intervall keine Handshakeantwort sendet, bricht der Client den Handshake ab und löst das Ereignis Closed aus (onclose in JavaScript). Dies ist eine erweiterte Einstellung, die nur geändert werden sollte, wenn aufgrund einer schwerwiegenden Netzwerklatenz entsprechende Timeoutfehler beim Handshake auftreten. Weitere Informationen zum Handshakeprozess finden Sie in der SignalR-Hubprotokollspezifikation.
KeepAliveInterval 15 Sekunden Legt das Intervall fest, in dem der Client Ping-Nachrichten sendet. Wenn Sie eine Nachricht vom Client senden, wird der Timer auf den Beginn des Intervalls zurückgesetzt. Wenn der Client keine Nachricht in dem auf dem Server festgelegten ClientTimeoutInterval gesendet hat, betrachtet der Server den Client als nicht verbunden.

Im .NET-Client werden die Timeoutwerte als TimeSpan-Werte angegeben.

Zusätzliche Optionen konfigurieren

Zusätzliche Optionen können in der WithUrl-Methode (withUrl in JavaScript) auf HubConnectionBuilder oder über die verschiedenen Konfigurations-APIs auf dem HttpHubConnectionBuilder im Java-Client konfiguriert werden:

.NET-Option Standardwert Beschreibung
AccessTokenProvider null Eine Funktion, die eine Zeichenfolge zurückgibt, die als Bearerauthentifizierungstoken in HTTP-Anforderungen bereitgestellt wird.
SkipNegotiation false Legen Sie diese auf true fest, um den Aushandlungsschritt zu überspringen. Nur unterstützt, wenn der WebSockets-Transport der einzige aktivierte Transport ist. Diese Einstellung kann nicht aktiviert werden, wenn Sie Azure SignalR Service verwenden.
ClientCertificates Empty Eine Sammlung von TLS-Zertifikaten, die zur Authentifizierung von Anforderungen gesendet werden.
Cookies Empty Eine Sammlung von HTTP-cookies, die mit jeder HTTP-Anforderung gesendet wird.
Credentials Empty Anmeldeinformationen, die mit jeder HTTP-Anforderung gesendet werden sollen.
CloseTimeout 5 Sekunden Nur WebSockets. Die maximale Zeitspanne, die der Client nach dem Schließen wartet, bis der Server die Anforderung zum Schließen bestätigt hat. Wenn der Server das Schließen nicht innerhalb dieser Zeit bestätigt, wird die Verbindung des Clients getrennt.
Headers Empty Eine Karte mit zusätzlichen HTTP-Headern, die mit jeder HTTP-Anforderung gesendet werden sollen.
HttpMessageHandlerFactory null Ein Delegat, der verwendet werden kann, um die zum Senden von HTTP-Anforderungen verwendeten HttpMessageHandler zu konfigurieren oder zu ersetzen. Wird nicht für WebSocket-Verbindungen verwendet. Dieser Delegat muss einen Wert ungleich NULL zurückgeben und empfängt den Standardwert als Parameter. Ändern Sie entweder die Einstellungen für diesen Standardwert und geben ihn zurück, oder geben Sie eine neue HttpMessageHandler-Instanz zurück. Wenn Sie den Handler ersetzen, stellen Sie sicher, dass Sie die Einstellungen, die Sie beibehalten möchten, aus dem bereitgestellten Handler kopieren. Andernfalls werden die konfigurierten Optionen (wie Cookies und Headers) nicht für den neuen Handler übernommen.
Proxy null Ein HTTP-Proxy, der beim Senden von HTTP-Anforderungen verwendet werden soll.
UseDefaultCredentials false Legen Sie diesen booleschen Wert fest, um die Standardanmeldeinformationen für HTTP- und WebSockets-Anforderungen zu senden. Dies ermöglicht die Verwendung der Windows-Authentifizierung.
WebSocketConfiguration null Ein Delegat, der zum Konfigurieren zusätzlicher WebSocket-Optionen verwendet werden kann. Erhält eine Instanz von ClientWebSocketOptions, die zur Konfiguration der Optionen verwendet werden kann.
ApplicationMaxBufferSize 1 MB Die maximale Anzahl der vom Server empfangenen Bytes, die der Client puffert, bevor er Gegendruck anwendet. Eine Erhöhung dieses Werts ermöglicht es dem Client, größere Nachrichten schneller zu empfangen, ohne Gegendruck auszuüben, kann aber den Arbeitsspeicherverbrauch erhöhen.
TransportMaxBufferSize 1 MB Die maximale Anzahl von Bytes, die von der Benutzeranwendung gesendet werden, die der Client vor der Beobachtung eines Gegendrucks puffert. Wenn Sie diesen Wert erhöhen, kann der Client größere Nachrichten schneller zwischenspeichern, ohne einen Gegendruck zu erwarten, was jedoch den Speicherverbrauch erhöhen kann.

Im .NET-Client können diese Optionen durch den Optionsdelegaten geändert werden, der WithUrl zur Verfügung gestellt wird:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

Im JavaScript-Client können diese Optionen in einem JavaScript-Objekt bereitgestellt werden, das für withUrl bereitgestellt wird:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Im Java-Client können diese Optionen mit den Methoden auf dem HttpHubConnectionBuilder konfiguriert werden, die von der HubConnectionBuilder.create("HUB URL") zurückgegeben werden.

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

Zusätzliche Ressourcen