Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este artículo cubre la configuración de ASP.NET Core SignalR.
Para obtener BlazorSignalR instrucciones, que agrega o reemplaza las instrucciones de este artículo, consulte ASP.NET Guía básicaBlazorSignalR.
Opciones de serialización JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, use el código siguiente en Program.cs
.
builder.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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor podría aumentar el riesgo de ataques por denegación de servicio (DoS). |
MaximumParallelInvocationsPerClient |
1 | El número máximo de métodos de concentrador que un cliente puede invocar en paralelo antes de que queden en cola. |
DisableImplicitFromServicesParameters |
false |
Si es posible, los argumentos del método de concentrador se resuelven a través de la inyección de dependencias. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
en Program.cs
.
builder.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:
builder.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 en Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
En la tabla siguiente se describen las opciones para configurar las opciones HTTP avanzadas de ASP.NET Core SignalR:
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ápido sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
TransportMaxBufferSize |
64 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes de manera más rápida sin esperar la contrapresión, lo cual puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo 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. |
CloseOnAuthenticationExpiration |
falso | Establezca esta opción para habilitar el seguimiento de expiración de autenticación, que cerrará las conexiones cuando expire un token. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo:
Opción | Valor predeterminado | Descripción |
---|---|---|
WithServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera para la actividad del servidor, que se establece directamente en HubConnectionBuilder. 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 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 intervalo de mantenimiento del servidor (WithKeepAliveInterval ) para dar tiempo a que lleguen los pings. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial del servidor y está disponible en el propio objeto HubConnection . 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
WithKeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de ping y se establece directamente en HubConnectionBuilder. Esta configuración permite al servidor detectar desconexiones físicas, como cuando un cliente desconecta su equipo de la red. 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
En el ejemplo siguiente se muestran valores que son el doble de los valores predeterminados:
var builder = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.WithServerTimeout(TimeSpan.FromSeconds(60))
.WithKeepAliveInterval(TimeSpan.FromSeconds(30))
.Build();
builder.On<string, string>("ReceiveMessage", (user, message) => ...
await builder.StartAsync();
Configurar reconexión con estado
La reconexión con estado de SignalR reduce el tiempo de inactividad percibido de los clientes que tienen una desconexión temporal en su conexión de red, como al cambiar las conexiones de red o una breve pérdida temporal de acceso.
La reconexión con estado lo consigue gracias a:
- Almacenamiento temporal en búfer de los datos en el servidor y el cliente.
- Confirmación de los mensajes recibidos (ACK-ing) tanto por el servidor como por el cliente.
- Reconocer cuándo una conexión está activa y retransmitir los mensajes que podrían haberse enviado mientras la conexión estaba inactiva.
La reconexión con estado está disponible en .NET 8 o posterior.
Opte por la reconexión con estado tanto en el punto de conexión del centro de servidores como en el cliente:
Actualice la configuración del punto de conexión del centro de servidores para habilitar la opción
AllowStatefulReconnects
:app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });
Opcionalmente, el tamaño máximo del búfer en bytes permitido por el servidor se puede establecer globalmente o para un centro específico con la opción
StatefulReconnectBufferSize
:La opción
StatefulReconnectBufferSize
establecida globalmente:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
La opción
StatefulReconnectBufferSize
establecida para un centro específico:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
La opción
StatefulReconnectBufferSize
es opcional con un valor predeterminado de 100 000 bytes.Actualice el código de cliente de JavaScript o TypeScript para habilitar la opción
withStatefulReconnect
:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();
La opción
bufferSize
es opcional con un valor predeterminado de 100 000 bytes.Actualice el código de cliente de .NET para habilitar la opción
WithStatefulReconnect
:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();
La opción
StatefulReconnectBufferSize
es opcional con un valor predeterminado de 100 000 bytes.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 el búfer antes de aplicar la contrapresión. Aumentar este valor permite al cliente recibir mensajes más grandes más rápido sin aplicar la presión inversa, 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 represión. Aumentar este valor permite al cliente almacenar en búfer mensajes más grandes más rápido sin esperar la represió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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 AddSignalR en su método Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerSettings propiedad de ese objeto es un objeto Json.NET JsonSerializerSettings
que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener más información, consulte la documentación de Json.NET.
Por ejemplo, para configurar el serializador para que use nombres de propiedad en "PascalCase", en lugar de la notación camel predeterminada, use el siguiente código en :
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 AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
Opción | Valor predeterminado | Descripción |
---|---|---|
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de Hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
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 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 las opciones HTTP avanzadas de ASP.NET Core SignalR:
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. Aumentar este valor permite al servidor recibir mensajes más grandes, pero puede afectar negativamente al consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados 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 su búfer. Aumentar este valor permite al servidor enviar mensajes más grandes, pero puede afectar negativamente al consumo de memoria. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo a continuación. | Opciones adicionales específicas del transporte de WebSockets. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a 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 SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 AddSignalR en su método Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerSettings propiedad de ese objeto es un objeto Json.NET JsonSerializerSettings
que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener más información, consulte la documentación de Json.NET.
Por ejemplo, para configurar el serializador para que use nombres de propiedad en "PascalCase", en lugar de la notación camel predeterminada, use el siguiente código en :
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 AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de Hub. El valor predeterminado es false porque estos mensajes de excepción pueden contener información confidencial. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
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 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 las opciones HTTP avanzadas de ASP.NET Core SignalR:
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. Aumentar este valor permite al servidor recibir mensajes más grandes, pero puede afectar negativamente al consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados 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 su búfer. Aumentar este valor permite al servidor enviar mensajes más grandes, pero puede afectar negativamente al consumo de memoria. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo a continuación. | Opciones adicionales específicas del transporte de WebSockets. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, 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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor puede aumentar el riesgo de ataques por denegación de servicio (DoS). |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
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 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 las opciones HTTP avanzadas de ASP.NET Core SignalR:
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 que el servidor reciba mensajes más grandes rápidamente sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
TransportMaxBufferSize |
32 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer rápidamente mensajes más grandes sin esperar resistencia, pero puede aumentar el consumo de memoria. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo a continuación. | Opciones adicionales específicas del transporte de WebSockets. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, 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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor puede aumentar el riesgo de ataques por denegación de servicio (DoS). |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
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 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 las opciones HTTP avanzadas de ASP.NET Core SignalR:
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 que el servidor reciba mensajes más grandes rápidamente sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
TransportMaxBufferSize |
32 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer rápidamente mensajes más grandes sin esperar resistencia, pero puede aumentar el consumo de memoria. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo 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 ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, 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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor puede aumentar el riesgo de ataques por denegación de servicio (DoS). |
MaximumParallelInvocationsPerClient |
1 | El número máximo de métodos de concentrador que un cliente puede invocar en paralelo antes de que queden en cola. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
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 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 las opciones HTTP avanzadas de ASP.NET Core SignalR:
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 que el servidor reciba mensajes más grandes rápidamente sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
TransportMaxBufferSize |
32 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer rápidamente mensajes más grandes sin esperar resistencia, pero puede aumentar el consumo de memoria. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo 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 ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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.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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Program.cs
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, use el código siguiente en Program.cs
.
builder.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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor puede aumentar el riesgo de ataques por denegación de servicio (DoS). |
MaximumParallelInvocationsPerClient |
1 | El número máximo de métodos de concentrador que un cliente puede invocar en paralelo antes de que queden en cola. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
en Program.cs
.
builder.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:
builder.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 en Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
En la tabla siguiente se describen las opciones para configurar las opciones HTTP avanzadas de ASP.NET Core SignalR:
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ápido sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
TransportMaxBufferSize |
64 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes de manera más rápida sin esperar la contrapresión, lo cual puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo 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. |
CloseOnAuthenticationExpiration |
falso | Establezca esta opción para habilitar el seguimiento de expiración de autenticación que cerrará las conexiones cuando expire un token. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 el búfer antes de aplicar la contrapresión. Aumentar este valor permite al cliente recibir mensajes más grandes más rápido sin aplicar la presión inversa, 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 represión. Aumentar este valor permite al cliente almacenar en búfer mensajes más grandes más rápido sin esperar la represió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 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 el HttpHubConnectionBuilder
que se devuelve 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 JSON/MessagePack
ASP.NET Core SignalR 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 utilizando el método de extensión AddJsonProtocol.
AddJsonProtocol
se puede agregar después de AddSignalR en Startup.ConfigureServices
. El método AddJsonProtocol
acepta un delegado que recibe un objeto options
. La PayloadSerializerOptions propiedad de ese objeto es un System.Text.Json
JsonSerializerOptions objeto que se puede usar para configurar la serialización de argumentos y valores devueltos. Para obtener 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 en los nombres de propiedad, en lugar de los nombres predeterminados en camel case, use el código siguiente en Program.cs
.
builder.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.
Cambiar a Newtonsoft.Json
Si necesita características de Newtonsoft.Json
que no se admiten en System.Text.Json
, vea Cambiar a Newtonsoft.Json
.
Opciones de serialización de MessagePack
La serialización de MessagePack se puede configurar proporcionando un delegado a la AddMessagePackProtocol llamada. Consulte MessagePack en SignalR para obtener más detalles.
Nota:
No es posible configurar la serialización de MessagePack en el cliente de JavaScript en este momento.
Configurar las opciones del servidor
En la siguiente tabla se describen las opciones para configurar SignalR hubs:
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. Puede tardar más de este intervalo de tiempo de espera para que el cliente sea marcado como desconectado debido a la forma en que se implementa. El valor recomendado es el doble del KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Si el cliente no envía un mensaje de inicio dentro de este intervalo de tiempo, se cierra la conexión. Se trata de una configuración avanzada que solo se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
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 , en el cliente, cambie la configuración ServerTimeout o serverTimeoutInMilliseconds . El valor recomendado ServerTimeout o serverTimeoutInMilliseconds es el doble del 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 , los mensajes detallados de excepción se devuelven a los clientes cuando se produce una excepción en un método de 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 invocaciones se bloquea hasta que el servidor procesa los elementos de secuencia. |
MaximumReceiveMessageSize |
32 KB | Tamaño máximo de un único mensaje de concentrador entrante. Aumentar el valor puede aumentar el riesgo de ataques por denegación de servicio (DoS). |
MaximumParallelInvocationsPerClient |
1 | El número máximo de métodos de concentrador que un cliente puede invocar en paralelo antes de que queden en cola. |
DisableImplicitFromServicesParameters |
false |
Si es posible, los argumentos del método del Hub se resolverán a través de la inyección de dependencias. |
Se pueden configurar opciones para todos los centros proporcionando un delegado de opciones a la llamada AddSignalR
en Program.cs
.
builder.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:
builder.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 en Program.cs
.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
En la tabla siguiente se describen las opciones para configurar las opciones HTTP avanzadas de ASP.NET Core SignalR:
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ápido sin aplicar la presión inversa, pero puede aumentar el consumo de memoria. |
TransportMaxBufferSize |
64 KB | Número máximo de bytes que envía la aplicación que el servidor almacena en su búfer antes de observar la contrapresión. Aumentar este valor permite al servidor almacenar en búfer mensajes más grandes de manera más rápida sin esperar la contrapresión, lo cual puede aumentar el consumo de memoria. |
AuthorizationData |
Los datos se recopilan automáticamente de los atributos Authorize que se aplican a la clase Hub. |
Lista de IAuthorizeData objetos usados para determinar si un cliente está autorizado para conectarse al centro. |
Transports |
Todos los medios de transporte 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éalo a continuación. | Opciones adicionales específicas del transporte de sondeo largo. |
WebSockets |
Véalo 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. |
CloseOnAuthenticationExpiration |
falso | Establezca esta opción para habilitar el seguimiento de expiración de autenticación que cerrará las conexiones cuando expire un token. |
El transporte de sondeo largo ofrece opciones adicionales que pueden configurarse a través de la propiedad LongPolling
.
Opción | Valor predeterminado | Descripción |
---|---|---|
PollTimeout |
90 segundos | La 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. Al reducir este valor, el cliente emite 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, se finaliza la conexión. |
SubProtocolSelector |
null |
Un delegado que se puede utilizar para establecer un valor personalizado para el encabezado Sec-WebSocket-Protocol . El delegado recibe los valores solicitados por el cliente como entrada y se espera que devuelva el valor deseado. |
Configuración de las opciones de cliente
Las opciones de cliente se pueden configurar en el HubConnectionBuilder
tipo (disponible en los clientes de .NET y JavaScript). También está disponible en el cliente de Java, pero la subclase HttpHubConnectionBuilder
es la que contiene las opciones de configuración del constructor, además de en el propio HubConnection
.
Configurar el registro
El registro se configura en el cliente de .NET usando el método ConfigureLogging
. Los proveedores y filtros de registro se pueden registrar de la misma manera que en el servidor. Consulte la documentación de Logging in ASP.NET Core (Registro en ASP.NET Core ) para obtener más información.
Nota:
Para registrar proveedores de 'logging', 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
paquete NuGet. Llame al método de extensión AddConsole
.
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 método similar configureLogging
. Proporcione un LogLevel
valor que indique el nivel mínimo de mensajes de registro que se van a generar. Los registros se registran en la ventana de la consola del navegador.
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 log. Esto resulta útil al configurar el registro de SignalR en entornos en los que no tienes acceso a las constantes de LogLevel
.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
En la tabla siguiente se enumeran los niveles de registro disponibles. El valor que proporciones para configureLogging
establece el nivel de log mínimo que se registrará. Los mensajes registrados en este nivel o los niveles enumerados después de él en la tabla se registrarán.
Cuerda | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
oinformation |
LogLevel.Information |
warn
owarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Nota:
Para deshabilitar el registro por completo, 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óstico.
El SignalR cliente de Java usa la biblioteca SLF4J para el registro. Es 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 incorporación de una dependencia de registro específica. En el fragmento de código siguiente se muestra cómo usar java.util.logging
con el SignalR cliente de Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
En caso de no configurar el registro en tus dependencias, SLF4J carga un registrador predeterminado de no operación 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 ignorar.
Configurar los transportes permitidos
Los transportes usados por SignalR se pueden configurar en la WithUrl
llamada (withUrl
en JavaScript). Se puede usar un OR bit a bit de los valores de HttpTransportType
para restringir el cliente para que solo use los transportes especificados. Todos los transportes están habilitados de forma predeterminada.
Por ejemplo, para deshabilitar el transporte de eventos de Server-Sent, pero permitir conexiones WebSockets y Long Polling:
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 options proporcionado a withUrl
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
En esta versión del cliente de Java WebSockets es el único transporte disponible.
En el cliente de Java, el transporte se selecciona con el método withTransport
en el HttpHubConnectionBuilder
. El cliente java usa el transporte de WebSockets de forma predeterminada.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Nota:
El SignalR cliente de Java aún no admite el cambio de transporte.
Configuración de la autenticación de portador
Para proporcionar datos de autenticación junto con SignalR las solicitudes, use la AccessTokenProvider
opción (accessTokenFactory
en JavaScript) para especificar una función que devuelva el token de acceso deseado. En el cliente .NET, este token de acceso se pasa como un token HTTP de "Autenticación de Portador" (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 Server-Sent eventos y solicitudes de 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 de opciones 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 de 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 SignalR cliente de Java, puede configurar un token de portador que se usará para la autenticación proporcionando una factoría de tokens de acceso a HttpHubConnectionBuilder. Use withAccessTokenFactory para proporcionar una cadena <. 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();
Configurar las opciones de tiempo de espera y conexión persistente
Hay disponibles opciones adicionales para configurar el tiempo de espera y el comportamiento de mantenimiento activo en el HubConnection
propio objeto:
Opción | Valor predeterminado | Descripción |
---|---|---|
ServerTimeout |
30 segundos (30 000 milisegundos) | Tiempo de espera por inactividad 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 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 al menos el doble del valor del KeepAliveInterval del servidor para permitir que los pings lleguen. |
HandshakeTimeout |
15 segundos | Tiempo de espera para el intercambio inicial con el 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 se debe modificar si se producen errores de tiempo de espera del handshake debido a una grave latencia de red. Para obtener más información sobre el proceso de establecimiento de conexión, consulte la Especificación del Protocolo del ConcentradorSignalR. |
KeepAliveInterval |
15 segundos | Determina el intervalo en el que el cliente envía mensajes de 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 tiempo establecido en el ClientTimeoutInterval por el servidor, el servidor considera que el cliente está desconectado. |
En el cliente .NET, los valores de TimeSpan
se especifican como tiempo de espera.
Configurar opciones adicionales
Se pueden configurar opciones adicionales en el WithUrl
método (withUrl
en JavaScript) en HubConnectionBuilder
o en las distintas API de configuración de en el HttpHubConnectionBuilder
cliente de 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 |
Establézcalo 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 al usar el servicio de Azure SignalR . |
ClientCertificates |
Vacío | Colección de certificados TLS que se van a enviar para autenticar solicitudes. |
Cookies |
Vacío | Colección de cookies HTTP que se van a enviar con cada solicitud HTTP. |
Credentials |
Vacío | Credenciales para enviar con cada solicitud HTTP. |
CloseTimeout |
5 segundos | Solo WebSockets. Cantidad máxima de tiempo que el cliente espera después de cerrar el servidor para confirmar la solicitud de cierre. Si el servidor no reconoce el cierre en este momento, el cliente se desconecta. |
Headers |
Vacío | Mapa de encabezados HTTP adicionales que se van a enviar con cada solicitud HTTP. |
HttpMessageHandlerFactory |
null |
Delegado que se puede usar para configurar o reemplazar el HttpMessageHandler usado 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. Ya sea que modifique la configuración de ese valor predeterminado y lo devuelva, o devuelva una nueva instancia de HttpMessageHandler .
Al reemplazar el controlador, asegúrese de copiar la configuración que desea mantener del controlador proporcionado; de lo contrario, las opciones configuradas (como cookies y encabezados) no se aplicarán al nuevo controlador. |
Proxy |
null |
Proxy HTTP que se va a 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 la autenticación de Windows. |
WebSocketConfiguration |
null |
Delegado que se puede usar para configurar opciones adicionales de WebSocket. 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 el búfer antes de aplicar la contrapresión. Aumentar este valor permite al cliente recibir mensajes más grandes más rápido sin aplicar la presión inversa, 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 represión. Aumentar este valor permite al cliente almacenar en búfer mensajes más grandes más rápido sin esperar la represió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 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 el HttpHubConnectionBuilder
que se devuelve desde el HubConnectionBuilder.create("HUB URL")
.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();