Configuración de SignalR en ASP.NET Core

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol. AddJsonProtocolse puede agregar después de agregar SignalR en Startup.ConfigureServices . El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerOptions de ese objeto es un objeto que se puede usar para configurar la serialización de System.Text.Json JsonSerializerOptions argumentos y valores devueltos. Para más información, consulte la documentación de System.Text.Json.

Por ejemplo, para configurar el serializador para que no cambie el uso de mayúsculas y minúsculas de los nombres de propiedad, en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Cambio a Newtonsoft.Json

Si necesita características de Newtonsoft.Json que no se admiten en , vea System.Text.Json Cambiar a Newtonsoft.Json .

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
ClientTimeoutInterval 30 segundos El servidor considera que el cliente está desconectado si no ha recibido un mensaje (incluido keep-alive) en este intervalo. El cliente podría tardar más tiempo que este intervalo de tiempo de espera en marcarse como desconectado debido a cómo se implementa esto. El valor recomendado es el doble del KeepAliveInterval valor.
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.
StreamBufferCapacity 10 Número máximo de elementos que se pueden almacenar en búfer para secuencias de carga de cliente. Si se alcanza este límite, el procesamiento de invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia.
MaximumReceiveMessageSize 32 KB Tamaño máximo de un único mensaje de centro de entrada.
MaximumParallelInvocationsPerClient 1 Número máximo de métodos de concentrador a los que cada cliente puede llamar en paralelo antes de poner en cola.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas de la aplicación:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 64 KB Número máximo de bytes recibidos del cliente que el servidor almacena en búfer antes de aplicar la contrapresión. Aumentar este valor permite al servidor recibir mensajes más grandes más rápidamente sin aplicar la contrapresión, pero puede aumentar el consumo de memoria.
TransportMaxBufferSize 64 KB Número máximo de bytes enviados por la aplicación que el servidor almacena en búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes más rápidamente sin esperar a la contrapresión, pero puede aumentar el consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de HttpTransportType valores que pueden restringir los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.
MinimumProtocolVersion 0 Especifique la versión mínima del protocolo negotiate. Esto se usa para limitar los clientes a versiones más recientes.
CloseOnAuthenticationExpiration false Establezca esta opción para habilitar el seguimiento de expiración de la autenticación que cerrará las conexiones cuando expire un token.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que se envíe un mensaje al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio.

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para obtener más información, consulte la documentación ASP.NET Core registro.

Nota

Para registrar los proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale el Microsoft.Extensions.Logging.Console NuGet paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

En lugar de un LogLevel valor, también puede proporcionar un valor string que represente un nombre de nivel de registro. Esto resulta útil al configurar el registro en entornos en los que SignalR no tiene acceso a las LogLevel constantes.

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

En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que se proporciona para configureLogging establece el nivel de registro mínimo que se registrará. Se registrarán los mensajes registrados en este nivel, o los niveles enumerados después de él en la tabla .

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info o information LogLevel.Information
warn o warning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, vea la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica al incorporar una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes utilizados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir el HttpTransportType cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo transport el campo en el objeto de opciones proporcionado en withUrl :

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

En esta versión de los websockets de cliente de Java es el único transporte disponible.

En el cliente de Java, el transporte se selecciona con el withTransport método en HttpHubConnectionBuilder . El cliente de Java usa de forma predeterminada el transporte de WebSockets.

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

Nota

El SignalR cliente de Java aún no admite la reserva de transporte.

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con solicitudes, use la opción ( en JavaScript) para especificar una función que SignalR devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente .NET, este token de acceso se pasa como un token de "autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (específicamente, en las solicitudes de eventos de Server-Sent y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente .NET, la AccessTokenProvider opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto de opciones en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar rxJava single <String> . Con una llamada a Single.defer,puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el Closed evento ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Determina el intervalo en el que el cliente envía mensajes ping. El envío de cualquier mensaje desde el cliente restablece el temporizador al inicio del intervalo. Si el cliente no ha enviado un mensaje en el conjunto en el servidor, el servidor ClientTimeoutInterval considera que el cliente está desconectado.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl de en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se enviarán para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales que se enviarán con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrarse para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Mapa de encabezados HTTP adicionales que se enviarán con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler utilizado para enviar solicitudes HTTP. No se usa para las conexiones de WebSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Un proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.
ApplicationMaxBufferSize 1 MB Número máximo de bytes recibidos del servidor que el cliente almacena en búfer antes de aplicar la contrapresión. Aumentar este valor permite al cliente recibir mensajes más grandes más rápidamente sin aplicar la contrapresión, pero puede aumentar el consumo de memoria.
TransportMaxBufferSize 1 MB Número máximo de bytes enviados por la aplicación de usuario que el cliente almacena en búfer antes de observar la contrapresión. Aumentar este valor permite al cliente almacenar en búfer mensajes más grandes más rápidamente sin esperar la contrapresión, pero puede aumentar el consumo de memoria.

En el cliente .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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();

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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();

En el cliente java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol. AddJsonProtocolse puede agregar después de agregar SignalR en Startup.ConfigureServices . El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerOptions de ese objeto es un objeto que se puede usar para configurar la serialización de System.Text.Json JsonSerializerOptions argumentos y valores devueltos. Para más información, consulte la documentación de System.Text.Json.

Por ejemplo, para configurar el serializador para que no cambie el uso de mayúsculas y minúsculas de los nombres de propiedad, en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Cambio a Newtonsoft.Json

Si necesita características de Newtonsoft.Json que no se admiten en , vea System.Text.Json Cambiar a Newtonsoft.Json .

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
ClientTimeoutInterval 30 segundos El servidor considera que el cliente está desconectado si no ha recibido un mensaje (incluido keep-alive) en este intervalo. El cliente podría tardar más tiempo que este intervalo de tiempo de espera en marcarse como desconectado debido a cómo se implementa esto. El valor recomendado es el doble del KeepAliveInterval valor.
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.
StreamBufferCapacity 10 Número máximo de elementos que se pueden almacenar en búfer para flujos de carga de cliente. Si se alcanza este límite, el procesamiento de las invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia.
MaximumReceiveMessageSize 32 KB Tamaño máximo de un único mensaje de centro de entrada.
MaximumParallelInvocationsPerClient 1 Número máximo de métodos de concentrador a los que cada cliente puede llamar en paralelo antes de poner en cola.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 32 KB Número máximo de bytes recibidos del cliente que el servidor almacena en búfer antes de aplicar la contrapresión. Aumentar este valor permite al servidor recibir mensajes más grandes más rápidamente sin aplicar la contrapresión, pero puede aumentar el consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
TransportMaxBufferSize 32 KB Número máximo de bytes enviados por la aplicación que el servidor almacena en búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes más rápidamente sin esperar a la contrapresión, pero puede aumentar el consumo de memoria.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de HttpTransportType valores que pueden restringir los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.
MinimumProtocolVersion 0 Especifique la versión mínima del protocolo negotiate. Se usa para limitar los clientes a versiones más recientes.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que un mensaje se envíe al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio.

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para más información, consulte la documentación ASP.NET Core inicio de sesión.

Nota

Para registrar proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale NuGet Microsoft.Extensions.Logging.Console paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

En lugar de LogLevel un valor, también puede proporcionar un string valor que represente un nombre de nivel de registro. Esto resulta útil al configurar el registro en entornos en los que SignalR no tiene acceso a las LogLevel constantes.

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

En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que se proporciona para configureLogging establece el nivel de registro mínimo que se registrará. Se registrarán los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla .

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info o information LogLevel.Information
warn o warning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, consulte la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica mediante la inserción de una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes usados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir que el cliente solo HttpTransportType use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo el transport campo en el objeto de opciones proporcionado en withUrl :

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

En esta versión de los websockets de cliente de Java es el único transporte disponible.

En el cliente de Java, el transporte se selecciona con el withTransport método en HttpHubConnectionBuilder . El cliente de Java usa de forma predeterminada el transporte de WebSockets.

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

Nota

El SignalR cliente de Java aún no admite la reserva de transporte.

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con las solicitudes, use la opción ( en JavaScript) para especificar una función SignalR que devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente de .NET, este token de acceso se pasa como un token "Autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (en concreto, en las solicitudes de Server-Sent Events y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente de .NET, AccessTokenProvider la opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto options en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar rxJava single. <String> Con una llamada a Single.defer,puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el Closed evento ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Determina el intervalo en el que el cliente envía mensajes ping. El envío de cualquier mensaje desde el cliente restablece el temporizador al inicio del intervalo. Si el cliente no ha enviado un mensaje en el conjunto en el servidor, el servidor ClientTimeoutInterval considera que el cliente está desconectado.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl de en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se enviarán para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales que se enviarán con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrarse para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Mapa de encabezados HTTP adicionales que se enviarán con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler utilizado para enviar solicitudes HTTP. No se usa para las conexiones de WebSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Un proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.

En el cliente de .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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();

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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();

En el cliente de Java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol. AddJsonProtocolse puede agregar después de agregar SignalR en Startup.ConfigureServices . El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerOptions de ese objeto es un objeto que se puede usar para configurar la serialización de System.Text.Json JsonSerializerOptions argumentos y valores devueltos. Para más información, consulte la documentación de System.Text.Json.

Por ejemplo, para configurar el serializador para que no cambie las mayúsculas y minúsculas de los nombres de propiedad, en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente de .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Cambio a Newtonsoft.Json

Si necesita características de Newtonsoft.Json que no se admiten en , vea System.Text.Json Cambiar a Newtonsoft.Json .

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
ClientTimeoutInterval 30 segundos El servidor considera que el cliente está desconectado si no ha recibido un mensaje (incluido keep-alive) en este intervalo. El cliente podría tardar más tiempo que este intervalo de tiempo de espera en marcarse como desconectado debido a cómo se implementa esto. El valor recomendado es el doble KeepAliveInterval del valor.
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para obtener más información sobre el proceso de protocolo de enlace, consulte la SignalR Especificación del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje de ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.
StreamBufferCapacity 10 Número máximo de elementos que se pueden almacenar en búfer para flujos de carga de cliente. Si se alcanza este límite, el procesamiento de las invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia.
MaximumReceiveMessageSize 32 KB Tamaño máximo de un único mensaje de centro de entrada.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 32 KB Número máximo de bytes recibidos del cliente que el servidor almacena en búfer antes de aplicar la contrapresión. Aumentar este valor permite al servidor recibir mensajes más grandes más rápidamente sin aplicar la contrapresión, pero puede aumentar el consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
TransportMaxBufferSize 32 KB Número máximo de bytes enviados por la aplicación que el servidor almacena en búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes más rápidamente sin esperar a la contrapresión, pero puede aumentar el consumo de memoria.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de valores que pueden restringir HttpTransportType los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.
MinimumProtocolVersion 0 Especifique la versión mínima del protocolo negotiate. Se usa para limitar los clientes a versiones más recientes.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que un mensaje se envíe al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio.

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para más información, consulte la documentación ASP.NET Core inicio de sesión.

Nota

Para registrar proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale NuGet Microsoft.Extensions.Logging.Console paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

En lugar de LogLevel un valor, también puede proporcionar un string valor que represente un nombre de nivel de registro. Esto resulta útil al configurar el registro en entornos en los que SignalR no tiene acceso a las LogLevel constantes.

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

En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que se proporciona para configureLogging establece el nivel de registro mínimo que se registrará. Se registrarán los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla .

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info o information LogLevel.Information
warn o warning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, consulte la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica mediante la inserción de una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes usados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir que el cliente solo HttpTransportType use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo el transport campo en el objeto de opciones proporcionado en withUrl :

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

En esta versión de los websockets de cliente de Java es el único transporte disponible.

En el cliente de Java, el transporte se selecciona con el withTransport método en HttpHubConnectionBuilder . El cliente de Java usa de forma predeterminada el transporte de WebSockets.

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

Nota

El SignalR cliente de Java aún no admite la reserva de transporte.

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con las solicitudes, use la opción ( en JavaScript) para especificar una función SignalR que devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente de .NET, este token de acceso se pasa como un token "Autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (en concreto, en las solicitudes de Server-Sent Events y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente de .NET, AccessTokenProvider la opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto options en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar rxJava Single <String> . Con una llamada a Single.defer, puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de la conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el evento Closed ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para obtener más información sobre el proceso de protocolo de enlace, consulte SignalR especificación del protocolo de concentrador.
KeepAliveInterval 15 segundos Determina el intervalo en el que el cliente envía mensajes ping. El envío de cualquier mensaje desde el cliente restablece el temporizador al inicio del intervalo. Si el cliente no ha enviado un mensaje en el conjunto en el servidor, el ClientTimeoutInterval servidor considera que el cliente está desconectado.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl de en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se enviarán para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales que se enviarán con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrarse para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Mapa de encabezados HTTP adicionales que se enviarán con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler que se usa para enviar solicitudes HTTP. No se usa para las conexiones de WebSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Un proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.

En el cliente .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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

En el cliente java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol. AddJsonProtocolse puede agregar después de agregar SignalR en Startup.ConfigureServices . El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerOptions de ese objeto es un objeto que se puede usar para configurar la serialización de System.Text.Json JsonSerializerOptions argumentos y valores devueltos. Para más información, consulte la documentación de System.Text.Json.

Por ejemplo, para configurar el serializador para que no cambie el uso de mayúsculas y minúsculas de los nombres de propiedad, en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Cambio a Newtonsoft.Json

Si necesita características de Newtonsoft.Json que no se admiten en , vea System.Text.Json Cambiar a Newtonsoft.Json .

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
ClientTimeoutInterval 30 segundos El servidor considera que el cliente está desconectado si no ha recibido un mensaje (incluido keep-alive) en este intervalo. El cliente podría tardar más tiempo que este intervalo de tiempo de espera en marcarse como desconectado debido a cómo se implementa esto. El valor recomendado es el doble del KeepAliveInterval valor.
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método Hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.
StreamBufferCapacity 10 Número máximo de elementos que se pueden almacenar en búfer para flujos de carga de cliente. Si se alcanza este límite, el procesamiento de las invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia.
MaximumReceiveMessageSize 32 KB Tamaño máximo de un único mensaje de centro de entrada.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 32 KB Número máximo de bytes recibidos del cliente que el servidor almacena en búfer antes de aplicar la contrapresión. Aumentar este valor permite al servidor recibir mensajes más grandes más rápidamente sin aplicar la contrapresión, pero puede aumentar el consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
TransportMaxBufferSize 32 KB Número máximo de bytes enviados por la aplicación que el servidor almacena en búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer los mensajes más grandes más rápidamente sin esperar a la contrapresión, pero puede aumentar el consumo de memoria.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de HttpTransportType valores que pueden restringir los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que un mensaje se envíe al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio.

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para más información, consulte la documentación ASP.NET Core inicio de sesión.

Nota

Para registrar proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale NuGet Microsoft.Extensions.Logging.Console paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

En lugar de LogLevel un valor, también puede proporcionar un string valor que represente un nombre de nivel de registro. Esto resulta útil al configurar el registro en entornos en los que SignalR no tiene acceso a las LogLevel constantes.

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

En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que se proporciona para configureLogging establece el nivel de registro mínimo que se registrará. Se registrarán los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla .

String LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info o information LogLevel.Information
warn o warning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, consulte la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica mediante la inserción de una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes usados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir que el cliente solo HttpTransportType use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo el transport campo en el objeto de opciones proporcionado en withUrl :

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

En esta versión de los websockets de cliente de Java es el único transporte disponible.

En el cliente de Java, el transporte se selecciona con el withTransport método en HttpHubConnectionBuilder . El cliente de Java usa de forma predeterminada el transporte de WebSockets.

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

Nota

El SignalR cliente de Java aún no admite la reserva de transporte.

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con las solicitudes, use la opción ( en JavaScript) para especificar una función SignalR que devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente de .NET, este token de acceso se pasa como un token "Autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (en concreto, en las solicitudes de Server-Sent Events y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente de .NET, AccessTokenProvider la opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto options en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar un rxJava single <String> . Con una llamada a Single.defer, puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el Closed evento ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Determina el intervalo en el que el cliente envía mensajes ping. El envío de cualquier mensaje desde el cliente restablece el temporizador al inicio del intervalo. Si el cliente no ha enviado un mensaje en el conjunto en el servidor, el servidor ClientTimeoutInterval considera que el cliente está desconectado.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl de en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se enviarán para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales que se enviarán con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrarse para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Mapa de encabezados HTTP adicionales que se enviarán con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler que se usa para enviar solicitudes HTTP. No se usa para las conexiones de WebSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Un proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.

En el cliente .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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

En el cliente java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol, que se puede agregar después de Agregar SignalR en el Startup.ConfigureServices método. El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerSettings de ese objeto es Json.NET objeto que se puede usar para configurar la serialización de JsonSerializerSettings argumentos y valores devueltos. Para obtener más información, vea la documentación Json.NET .

Por ejemplo, para configurar el serializador para que use nombres de propiedad "PascalCase", en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
ClientTimeoutInterval 30 segundos El servidor considera que el cliente está desconectado si no ha recibido un mensaje (incluido keep-alive) en este intervalo. El cliente podría tardar más tiempo que este intervalo de tiempo de espera en marcarse como desconectado debido a cómo se implementa esto. El valor recomendado es el doble del KeepAliveInterval valor.
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para más información sobre el proceso de protocolo de enlace, consulte especificación SignalR del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas de la aplicación:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 32 KB Número máximo de bytes recibidos del cliente que almacena en búfer el servidor. Aumentar este valor permite que el servidor reciba mensajes de mayor tamaño, pero puede afectar negativamente al consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
TransportMaxBufferSize 32 KB Número máximo de bytes enviados por la aplicación que almacena en búfer el servidor. Aumentar este valor permite al servidor enviar mensajes más grandes, pero puede afectar negativamente al consumo de memoria.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de HttpTransportType valores que pueden restringir los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que se envíe un mensaje al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio .

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para obtener más información, consulte la documentación ASP.NET Core registro.

Nota

Para registrar los proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale el Microsoft.Extensions.Logging.Console NuGet paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, vea la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica al incorporar una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes utilizados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir el HttpTransportType cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo el transport campo en el objeto de opciones proporcionado en withUrl :

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

En esta versión de los websockets de cliente de Java es el único transporte disponible.

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con las solicitudes, use la opción ( en JavaScript) para especificar una función SignalR que devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente de .NET, este token de acceso se pasa como un token "Autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (en concreto, en las solicitudes de Server-Sent Events y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente de .NET, AccessTokenProvider la opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto options en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar un rxJava single <String> . Con una llamada a Single.defer, puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de la conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el evento Closed ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para obtener más información sobre el proceso de protocolo de enlace, consulte SignalR especificación del protocolo de concentrador.
KeepAliveInterval 15 segundos Determina el intervalo en el que el cliente envía mensajes ping. El envío de cualquier mensaje desde el cliente restablece el temporizador al inicio del intervalo. Si el cliente no ha enviado un mensaje en el conjunto en el servidor, el ClientTimeoutInterval servidor considera que el cliente está desconectado.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se envían para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales que se envían con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. La cantidad máxima de tiempo que el cliente espera después de cerrar para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Asignación de encabezados HTTP adicionales para enviar con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler utilizado para enviar solicitudes HTTP. No se usa para las conexiones webSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.

En el cliente de .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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

En el cliente de Java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales

Opciones de serialización de JSON/MessagePack

SignalRASP.NET Core admite dos protocolos para codificar mensajes: JSON y MessagePack. Cada protocolo tiene opciones de configuración de serialización.

La serialización JSON se puede configurar en el servidor mediante el método de extensión AddJsonProtocol, que se puede agregar después de SignalR Agregar en el Startup.ConfigureServices método. El AddJsonProtocol método toma un delegado que recibe un objeto options . La propiedad PayloadSerializerSettings de ese objeto es un Json.NET que se puede usar para configurar la serialización de JsonSerializerSettings argumentos y valores devueltos. Para obtener más información, consulte la documentación Json.NET .

Por ejemplo, para configurar el serializador para que use nombres de propiedad "PascalCase", en lugar de los nombres de mayúsculas y minúsculas camel predeterminados, use el código siguiente en Startup.ConfigureServices :

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

En el cliente de .NET, existe el mismo AddJsonProtocol método de extensión en HubConnectionBuilder. El Microsoft.Extensions.DependencyInjection espacio de nombres debe importarse para resolver el método de extensión:

// 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();

Nota

No es posible configurar la serialización JSON en el cliente de JavaScript en este momento.

Opciones de serialización de MessagePack

La serialización de MessagePack se puede configurar proporcionando un delegado a la llamada AddMessagePackProtocol. Consulte MessagePack SignalR en para obtener más detalles.

Nota

No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.

Configuración de opciones de servidor

En la tabla siguiente se describen las opciones para configurar SignalR concentradores:

Opción Valor predeterminado Descripción
HandshakeTimeout 15 segundos Si el cliente no envía un mensaje de protocolo de enlace inicial dentro de este intervalo de tiempo, la conexión se cierra. Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para obtener más información sobre el proceso de protocolo de enlace, consulte SignalR especificación del protocolo de concentrador.
KeepAliveInterval 15 segundos Si el servidor no ha enviado un mensaje dentro de este intervalo, se envía automáticamente un mensaje de ping para mantener abierta la conexión. Al cambiar KeepAliveInterval , cambie la configuración o en el ServerTimeout serverTimeoutInMilliseconds cliente. El valor ServerTimeout recomendado o es el doble del serverTimeoutInMilliseconds KeepAliveInterval valor.
SupportedProtocols Todos los protocolos instalados Protocolos admitidos por este centro. De forma predeterminada, se permiten todos los protocolos registrados en el servidor. Los protocolos se pueden quitar de esta lista para deshabilitar protocolos específicos para centros individuales.
EnableDetailedErrors false Si true es , los mensajes de excepción detallados se devuelven a los clientes cuando se produce una excepción en un método hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial.

Las opciones se pueden configurar para todos los centros proporcionando un delegado de opciones a la AddSignalR llamada en Startup.ConfigureServices .

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

Las opciones de un único centro invalidan las opciones globales proporcionadas en AddSignalR y se pueden configurar mediante AddHubOptions :

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

Opciones avanzadas de configuración HTTP

Use HttpConnectionDispatcherOptions para configurar opciones avanzadas relacionadas con los transportes y la administración del búfer de memoria. Estas opciones se configuran pasando un delegado a MapHub <T> en Startup.Configure .

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

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

En la tabla siguiente se describen las opciones para configurar ASP.NET Core SignalR opciones HTTP avanzadas:

Opción Valor predeterminado Descripción
ApplicationMaxBufferSize 32 KB Número máximo de bytes recibidos del cliente que almacena en búfer el servidor. Aumentar este valor permite que el servidor reciba mensajes de mayor tamaño, pero puede afectar negativamente al consumo de memoria.
AuthorizationData Datos recopilados automáticamente a partir de los Authorize atributos aplicados a la clase Hub. Lista de objetos IAuthorizeData que se usan para determinar si un cliente está autorizado para conectarse al centro.
TransportMaxBufferSize 32 KB Número máximo de bytes enviados por la aplicación que almacena en búfer el servidor. Aumentar este valor permite al servidor enviar mensajes más grandes, pero puede afectar negativamente al consumo de memoria.
Transports Todos los transportes están habilitados. Enumeración de marcas de bits de HttpTransportType valores que pueden restringir los transportes que un cliente puede usar para conectarse.
LongPolling Véase a continuación. Opciones adicionales específicas del transporte de sondeo largo.
WebSockets Véase a continuación. Opciones adicionales específicas del transporte de WebSockets.

El transporte de sondeo largo tiene opciones adicionales que se pueden configurar mediante la LongPolling propiedad :

Opción Valor predeterminado Descripción
PollTimeout 90 segundos Cantidad máxima de tiempo que el servidor espera a que un mensaje se envíe al cliente antes de finalizar una única solicitud de sondeo. La reducción de este valor hace que el cliente emita nuevas solicitudes de sondeo con más frecuencia.

El transporte de WebSocket tiene opciones adicionales que se pueden configurar mediante la WebSockets propiedad :

Opción Valor predeterminado Descripción
CloseTimeout 5 segundos Una vez que se cierra el servidor, si el cliente no se cierra dentro de este intervalo de tiempo, la conexión finaliza.
SubProtocolSelector null Delegado que se puede usar para establecer el Sec-WebSocket-Protocol encabezado en un valor personalizado. El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado.

Configuración de opciones de cliente

Las opciones de cliente se pueden configurar en HubConnectionBuilder el tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase es la que contiene las opciones de configuración del generador, así como HttpHubConnectionBuilder en HubConnection el propio.

registro

El registro se configura en el cliente de .NET mediante el ConfigureLogging método . Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Para más información, consulte la documentación ASP.NET Core inicio de sesión.

Nota

Para registrar proveedores de registro, debe instalar los paquetes necesarios. Consulte la sección Proveedores de registro integrados de los documentos para obtener una lista completa.

Por ejemplo, para habilitar el registro de consola, instale NuGet Microsoft.Extensions.Logging.Console paquete. Llame al método AddConsole de extensión:

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

En el cliente de JavaScript, existe un configureLogging método similar. Proporcione un LogLevel valor que indique el nivel mínimo de mensajes de registro que se producirán. Los registros se escriben en la ventana de la consola del explorador.

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

Nota

Para deshabilitar completamente el registro, especifique signalR.LogLevel.None en el configureLogging método .

Para obtener más información sobre el registro, consulte la SignalR documentación de Diagnósticos.

El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Se trata de una API de registro de alto nivel que permite a los usuarios de la biblioteca elegir su propia implementación de registro específica mediante la inserción de una dependencia de registro específica. El siguiente fragmento de código muestra cómo usar java.util.logging con el cliente de SignalR Java.

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

Si no configura el registro en las dependencias, SLF4J carga un registrador de no operación predeterminado con el siguiente mensaje de advertencia:

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.

Esto se puede omitir de forma segura.

Configuración de transportes permitidos

Los transportes usados por SignalR se pueden configurar en la llamada ( en WithUrl withUrl JavaScript). Se puede usar un OR bit a bit de los valores de para restringir que el cliente solo HttpTransportType use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.

Por ejemplo, para deshabilitar el transporte Server-Sent eventos, pero permitir webSockets y conexiones de sondeo largo:

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

En el cliente de JavaScript, los transportes se configuran estableciendo el transport campo en el objeto de opciones proporcionado en withUrl :

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

Configuración de la autenticación de portador

Para proporcionar datos de autenticación junto con las solicitudes, use la opción ( en JavaScript) para especificar una función SignalR que devuelva el token de acceso AccessTokenProvider accessTokenFactory deseado. En el cliente de .NET, este token de acceso se pasa como un token "Autenticación de portador" HTTP (mediante el encabezado Authorization con un tipo de Bearer ). En el cliente de JavaScript, el token de acceso se usa como token de portador, excepto en algunos casos en los que las API del explorador restringen la capacidad de aplicar encabezados (en concreto, en las solicitudes de Server-Sent Events y WebSockets). En estos casos, el token de acceso se proporciona como un valor de cadena de consulta access_token .

En el cliente de .NET, AccessTokenProvider la opción se puede especificar mediante el delegado options en WithUrl :

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

En el cliente de JavaScript, el token de acceso se configura estableciendo el accessTokenFactory campo en el objeto options en withUrl :

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();

En el cliente de Java, puede configurar un token de portador para usarlo para la autenticación proporcionando un generador de tokens de acceso SignalR a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar rxJava Single <String> . Con una llamada a Single.defer, puede escribir lógica para generar tokens de acceso para el cliente.

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

Configuración de las opciones de tiempo de espera y de conexión continua

Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de la conexión continua en el HubConnection propio objeto:

Opción Valor predeterminado Descripción
ServerTimeout 30 segundos (30 000 milisegundos) Tiempo de espera para la actividad del servidor. Si el servidor no ha enviado un mensaje en este intervalo, el cliente considera que el servidor está desconectado y desencadena el Closed evento ( onclose en JavaScript). Este valor debe ser lo suficientemente grande como para que el cliente envíe un mensaje de ping desde el servidor y lo reciba dentro del intervalo de tiempo de espera. El valor recomendado es un número al menos el doble del valor del servidor para permitir que KeepAliveInterval lleguen los pings.
HandshakeTimeout 15 segundos Tiempo de espera para el protocolo de enlace inicial del servidor. Si el servidor no envía una respuesta de protocolo de enlace en este intervalo, el cliente cancela el protocolo de enlace y desencadena el evento Closed ( onclose en JavaScript). Se trata de una configuración avanzada que solo debe modificarse si se producen errores de tiempo de espera de protocolo de enlace debido a una latencia de red grave. Para obtener más información sobre el proceso de protocolo de enlace, consulte SignalR especificación del protocolo de concentrador.

En el cliente de .NET, los valores de tiempo de espera se especifican como TimeSpan valores.

Configuración de opciones adicionales

Se pueden configurar opciones adicionales en el método ( en JavaScript) en o en las distintas API de configuración WithUrl de en el cliente de withUrl HubConnectionBuilder HttpHubConnectionBuilder Java:

Opción de .NET Valor predeterminado Descripción
AccessTokenProvider null Función que devuelve una cadena que se proporciona como token de autenticación de portador en solicitudes HTTP.
SkipNegotiation false Establezca esta opción en true para omitir el paso de negociación. Solo se admite cuando el transporte de WebSockets es el único transporte habilitado. Esta configuración no se puede habilitar cuando se usa el servicio de SignalR Azure.
ClientCertificates Vacío Colección de certificados TLS que se envían para autenticar las solicitudes.
Cookies Vacío Colección de HTTP cookie que se va a enviar con cada solicitud HTTP.
Credentials Vacío Credenciales para enviar con cada solicitud HTTP.
CloseTimeout 5 segundos Solo WebSockets. La cantidad máxima de tiempo que el cliente espera después de cerrar para que el servidor confirme la solicitud de cierre. Si el servidor no confirma el cierre dentro de este tiempo, el cliente se desconecta.
Headers Vacío Asignación de encabezados HTTP adicionales para enviar con cada solicitud HTTP.
HttpMessageHandlerFactory null Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler utilizado para enviar solicitudes HTTP. No se usa para las conexiones webSocket. Este delegado debe devolver un valor distinto de NULL y recibe el valor predeterminado como parámetro. Modifique la configuración de ese valor predeterminado y devolución, o bien devuelva una nueva HttpMessageHandler instancia. Al reemplazar el controlador, asegúrese de copiar la configuración que desea conservar del controlador proporcionado; de lo contrario, las opciones configuradas (como s y Headers) no se aplicarán al Cookie nuevo controlador.
Proxy null Proxy HTTP que se usará al enviar solicitudes HTTP.
UseDefaultCredentials false Establezca este valor booleano para enviar las credenciales predeterminadas para las solicitudes HTTP y WebSockets. Esto permite el uso de Windows autenticación.
WebSocketConfiguration null Delegado que se puede usar para configurar opciones de WebSocket adicionales. Recibe una instancia de ClientWebSocketOptions que se puede usar para configurar las opciones.

En el cliente .NET, estas opciones se pueden modificar mediante el delegado de opciones proporcionado a WithUrl :

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

En el cliente de JavaScript, estas opciones se pueden proporcionar en un objeto de JavaScript proporcionado a withUrl :

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

En el cliente java, estas opciones se pueden configurar con los métodos en HttpHubConnectionBuilder el devuelto desde el HubConnectionBuilder.create("HUB URL")

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

Recursos adicionales