Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo aborda a configuração do ASP.NET Core SignalR.
Para BlazorSignalR obter orientações, que complementam ou substituem as diretrizes deste artigo, consulte ASP.NET Diretrizes principaisBlazorSignalR.
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Startup.ConfigureServices. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
MaximumParallelInvocationsPerClient |
1 | O número máximo de métodos de 'hub' que cada cliente pode chamar simultaneamente antes de entrar na fila. |
DisableImplicitFromServicesParameters |
false |
Os argumentos do método Hub são resolvidos a partir da DI, se possível. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRProgram.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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();
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
64 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor armazene em buffer mensagens maiores mais rapidamente sem aguardar contrapressão, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
MinimumProtocolVersion |
0 | Especifique a versão mínima do protocolo de negociação. Isso é usado para limitar os clientes a versões mais recentes. |
CloseOnAuthenticationExpiration |
falso | Defina essa opção para habilitar o rastreamento de expiração de autenticação, que fechará as conexões quando um token expirar. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento keep-alive:
| Opção | Valor predefinido | Descrição |
|---|---|---|
WithServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor e é definido diretamente em HubConnectionBuilder. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do intervalo keep-alive (WithKeepAliveInterval) do servidor para permitir a chegada de pings. |
HandshakeTimeout |
15 segundos | O tempo limite para o handshake inicial do servidor está disponível no próprio objeto HubConnection. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
WithKeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping e é definido diretamente no HubConnectionBuilder. Essa configuração permite que o servidor detete desconexões rígidas, como quando um cliente desconecta o computador da rede. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
O exemplo a seguir mostra valores que são o dobro dos valores padrão:
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 a reconexão com monitoração de estado
SignalR A reconexão com estado reduz o tempo de inatividade percebido dos clientes que têm uma desconexão temporária na sua conexão de rede, como ao alternar conexões de rede ou durante uma breve perda de acesso.
A reconexão com estado alcança isso ao:
- Armazenamento temporário de dados em buffer no servidor e no cliente.
- Confirmação de mensagens recebidas (ACK-ing) pelo servidor e pelo cliente.
- Reconhecer quando uma conexão está ativa e reproduzir mensagens que poderiam ter sido enviadas enquanto a conexão estava inativa.
A reconexão preservando o estado está disponível no .NET 8 ou posterior.
Opte pela reconexão com monitoração de estado no ponto de extremidade do hub do servidor e no cliente:
Atualize a configuração do ponto de extremidade do hub do servidor para habilitar a opção
AllowStatefulReconnects:app.MapHub<MyHub>("/hubName", options => { options.AllowStatefulReconnects = true; });Opcionalmente, o tamanho máximo do buffer em bytes permitido pelo servidor pode ser definido globalmente ou para um hub específico com a opção
StatefulReconnectBufferSize:As opções
StatefulReconnectBufferSizedefinidas globalmente:builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);A opção
StatefulReconnectBufferSizedefinida para um hub específico:builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);A opção
StatefulReconnectBufferSizeé opcional com um padrão de 100.000 bytes.Atualize o código do cliente JavaScript ou TypeScript para ativar a opção
withStatefulReconnect:const builder = new signalR.HubConnectionBuilder() .withUrl("/hubname") .withStatefulReconnect({ bufferSize: 1000 }); // Optional, defaults to 100,000 const connection = builder.build();A opção
bufferSizeé opcional com um padrão de 100.000 bytes.Atualize o código do cliente .NET para habilitar a opção
WithStatefulReconnect:var builder = new HubConnectionBuilder() .WithUrl("<hub url>") .WithStatefulReconnect(); builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000); var hubConnection = builder.Build();A opção
StatefulReconnectBufferSizeé opcional com um padrão de 100.000 bytes.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
ApplicationMaxBufferSize |
1 MB | O número máximo de bytes recebidos do servidor que o cliente armazena em buffer antes de aplicar backpressure. Aumentar esse valor permite que o cliente receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
1 MB | O número máximo de bytes enviados pela aplicação do utilizador que o cliente armazena em buffer antes de observar a "backpressure". Aumentar este valor permite que o cliente armazene mensagens maiores em buffer mais rapidamente sem ter de lidar com o backpressure, mas pode aumentar o consumo de memória. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para 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();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para 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();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão, que pode ser adicionado depois AddSignalR em seu Startup.ConfigureServices método. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerSettings propriedade nesse objeto é um objeto Json.NET JsonSerializerSettings que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação do Json.NET.
Por exemplo, para configurar o serializador para usar nomes de propriedade "PascalCase", em vez de nomes padrão em "camel case", use o seguinte código em :
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRStartup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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;
});
});
}
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | O número máximo de bytes recebidos do cliente que o servidor armazena em buffer. Aumentar esse valor permite que o servidor receba mensagens maiores, mas pode afetar negativamente o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
TransportMaxBufferSize |
32 KB | O número máximo de bytes enviados pelo aplicativo que o servidor armazena em buffer. Aumentar esse valor permite que o servidor envie mensagens maiores, mas pode afetar negativamente o consumo de memória. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão, que pode ser adicionado depois AddSignalR em seu Startup.ConfigureServices método. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerSettings propriedade nesse objeto é um objeto Json.NET JsonSerializerSettings que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação do Json.NET.
Por exemplo, para configurar o serializador para usar nomes de propriedade "PascalCase", em vez de nomes padrão em "camel case", use o seguinte código em :
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRStartup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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;
});
});
}
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | O número máximo de bytes recebidos do cliente que o servidor armazena em buffer. Aumentar esse valor permite que o servidor receba mensagens maiores, mas pode afetar negativamente o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
TransportMaxBufferSize |
32 KB | O número máximo de bytes enviados pelo aplicativo que o servidor armazena em buffer. Aumentar esse valor permite que o servidor envie mensagens maiores, mas pode afetar negativamente o consumo de memória. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Startup.ConfigureServices. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRStartup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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;
});
});
}
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
TransportMaxBufferSize |
32 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor faça o armazenamento em buffer de mensagens maiores de forma mais rápida, sem esperar a contrapressão, mas pode aumentar o consumo de memória. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Startup.ConfigureServices. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRStartup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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;
});
});
}
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
TransportMaxBufferSize |
32 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor faça o armazenamento em buffer de mensagens maiores de forma mais rápida, sem esperar a contrapressão, mas pode aumentar o consumo de memória. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
MinimumProtocolVersion |
0 | Especifique a versão mínima do protocolo de negociação. Isso é usado para limitar os clientes a versões mais recentes. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.Headers["Foo"] = "Bar";
options.Cookies.Add(new Cookie(/* ... */);
options.ClientCertificates.Add(/* ... */);
})
.Build();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", {
skipNegotiation: true,
transport: signalR.HttpTransportType.WebSockets
})
.build();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Startup.ConfigureServices. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
MaximumParallelInvocationsPerClient |
1 | O número máximo de métodos de 'hub' que cada cliente pode chamar simultaneamente antes de entrar na fila. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRStartup.ConfigureServices.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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;
});
});
}
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
32 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
TransportMaxBufferSize |
32 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor faça o armazenamento em buffer de mensagens maiores de forma mais rápida, sem esperar a contrapressão, mas pode aumentar o consumo de memória. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
MinimumProtocolVersion |
0 | Especifique a versão mínima do protocolo de negociação. Isso é usado para limitar os clientes a versões mais recentes. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para 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();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para 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();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Program.cs. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
MaximumParallelInvocationsPerClient |
1 | O número máximo de métodos de 'hub' que cada cliente pode chamar simultaneamente antes de entrar na fila. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRProgram.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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();
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
64 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor armazene em buffer mensagens maiores mais rapidamente sem aguardar contrapressão, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
MinimumProtocolVersion |
0 | Especifique a versão mínima do protocolo de negociação. Isso é usado para limitar os clientes a versões mais recentes. |
CloseOnAuthenticationExpiration |
falso | Defina essa opção para habilitar o rastreamento de expiração de autenticação, que fechará as conexões quando um token expirar. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
ApplicationMaxBufferSize |
1 MB | O número máximo de bytes recebidos do servidor que o cliente armazena em buffer antes de aplicar backpressure. Aumentar esse valor permite que o cliente receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
1 MB | O número máximo de bytes enviados pela aplicação do utilizador que o cliente armazena em buffer antes de observar a "backpressure". Aumentar este valor permite que o cliente armazene mensagens maiores em buffer mais rapidamente sem ter de lidar com o backpressure, mas pode aumentar o consumo de memória. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para 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();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para 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();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
Recursos adicionais
Opções de serialização JSON/MessagePack
ASP.NET Core SignalR suporta dois protocolos para codificação de mensagens: JSON e MessagePack. Cada protocolo tem opções de configuração de serialização.
A serialização JSON pode ser configurada no servidor usando o AddJsonProtocol método de extensão.
AddJsonProtocol pode ser adicionado depois AddSignalR em Startup.ConfigureServices. O AddJsonProtocol método usa um delegado que recebe um options objeto. A PayloadSerializerOptions propriedade nesse objeto é um System.Text.JsonJsonSerializerOptions objeto que pode ser usado para configurar a serialização de argumentos e valores de retorno. Para obter mais informações, consulte a documentação System.Text.Json.
Por exemplo, para configurar o serializador para não alterar a capitalização dos nomes das propriedades, ao invés de usar os nomes em formato padrão camel case, utilize o seguinte código em :
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
No cliente .NET, o mesmo AddJsonProtocol método de extensão existe no HubConnectionBuilder. O Microsoft.Extensions.DependencyInjection namespace deve ser importado para resolver o método de extensão:
// 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();
Observação
Não é possível configurar a serialização JSON no cliente JavaScript no momento.
Troque para Newtonsoft.Json
Se precisar de funcionalidades Newtonsoft.Json que não são suportadas no System.Text.Json, consulte Considere mudar para Newtonsoft.Json.
Opções de serialização do MessagePack
A serialização do MessagePack pode ser configurada fornecendo um delegado para a AddMessagePackProtocol chamada. Consulte MessagePack em SignalR para obter mais detalhes.
Observação
Não é possível configurar a serialização do MessagePack no cliente JavaScript no momento.
Configure as opções do servidor
A tabela a seguir descreve as opções para configurar SignalR hubs:
| Opção | Valor padrão | Descrição |
|---|---|---|
ClientTimeoutInterval |
30 segundos | O servidor considera o cliente desconectado se ele não tiver recebido uma mensagem (incluindo keep-alive) nesse intervalo. Pode levar mais tempo do que esse intervalo de tempo limite para que o cliente seja marcado como desconectado devido à forma como isso é implementado. O valor recomendado é o dobro do KeepAliveInterval valor. |
HandshakeTimeout |
15 segundos | Se o cliente não enviar uma mensagem inicial de handshake dentro desse intervalo de tempo, a conexão será fechada. Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Se o servidor não tiver enviado uma mensagem dentro desse intervalo, uma mensagem de ping será enviada automaticamente para manter a conexão aberta. Ao alterar KeepAliveInterval, altere a configuração de ServerTimeout ou serverTimeoutInMilliseconds no cliente. O valor recomendado ServerTimeout ou serverTimeoutInMilliseconds é o dobro do KeepAliveInterval valor. |
SupportedProtocols |
Todos os protocolos instalados | Protocolos suportados por este hub. Por padrão, todos os protocolos registrados no servidor são permitidos. Os protocolos podem ser removidos desta lista para desativar protocolos específicos para hubs individuais. |
EnableDetailedErrors |
false |
Se true, mensagens de exceção detalhadas são retornadas aos clientes quando uma exceção é lançada em um método Hub. O padrão é false porque essas mensagens de exceção podem conter informações confidenciais. |
StreamBufferCapacity |
10 |
O número máximo de itens que podem ser armazenados em buffer para fluxos de carregamento do cliente. Se esse limite for atingido, o processamento de invocações será bloqueado até que o servidor processe itens de fluxo. |
MaximumReceiveMessageSize |
32 KB | Tamanho máximo de uma única mensagem de hub de entrada. Aumentar o valor pode aumentar o risco de ataques de negação de serviço (DoS). |
MaximumParallelInvocationsPerClient |
1 | O número máximo de métodos de 'hub' que cada cliente pode chamar simultaneamente antes de entrar na fila. |
DisableImplicitFromServicesParameters |
false |
Os argumentos do método Hub serão resolvidos a partir da DI, se possível. |
As opções podem ser configuradas para todos os hubs fornecendo um delegado de opções à chamada em AddSignalRProgram.cs.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
As opções de um único hub substituem as opções globais fornecidas em AddSignalR e podem ser configuradas através de AddHubOptions.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
Opções avançadas de configuração HTTP
Use HttpConnectionDispatcherOptions para definir configurações avançadas relacionadas a transportes e gerenciamento de buffer de memória. Essas opções são configuradas passando um delegado para MapHub em 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();
A tabela a seguir descreve as opções para configurar as opções avançadas de HTTP do ASP.NET Core SignalR:
| Opção | Valor padrão | Descrição |
|---|---|---|
ApplicationMaxBufferSize |
64 KB | O número máximo de bytes recebidos do cliente que o servidor armazena num buffer antes de aplicar pressão inversa. Aumentar esse valor permite que o servidor receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
64 KB | O número máximo de bytes enviados pela aplicação que o servidor armazena em buffer antes de observar a contrapressão. Aumentar este valor permite que o servidor armazene em buffer mensagens maiores mais rapidamente sem aguardar contrapressão, mas pode aumentar o consumo de memória. |
AuthorizationData |
Dados coletados automaticamente dos Authorize atributos aplicados à classe Hub. |
Uma lista de IAuthorizeData objetos usados para determinar se um cliente está autorizado a se conectar ao hub. |
Transports |
Todos os transportes estão ativados. | Um bit sinaliza enum de HttpTransportType valores que podem restringir os transportes que um cliente pode usar para se conectar. |
LongPolling |
Ver abaixo. | Opções adicionais específicas para o transporte Long Polling. |
WebSockets |
Ver abaixo. | Opções adicionais específicas para o transporte de WebSockets. |
MinimumProtocolVersion |
0 | Especifique a versão mínima do protocolo de negociação. Isso é usado para limitar os clientes a versões mais recentes. |
CloseOnAuthenticationExpiration |
falso | Defina essa opção para habilitar o rastreamento de expiração de autenticação, que fechará as conexões quando um token expirar. |
O transporte Long Polling tem opções adicionais que podem ser configuradas usando a LongPolling propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
PollTimeout |
90 segundos | A quantidade máxima de tempo que o servidor aguarda que uma mensagem seja enviada ao cliente antes de encerrar uma única solicitação de sondagem. A diminuição desse valor faz com que o cliente emita novas solicitações de pesquisa com mais frequência. |
O transporte WebSocket tem opções adicionais que podem ser configuradas usando a WebSockets propriedade:
| Opção | Valor padrão | Descrição |
|---|---|---|
CloseTimeout |
5 segundos | Depois que o servidor fecha, se o cliente não conseguir fechar dentro desse intervalo de tempo, a conexão será encerrada. |
SubProtocolSelector |
null |
Um delegado que pode ser usado para definir o Sec-WebSocket-Protocol cabeçalho como um valor personalizado. O delegado recebe os valores solicitados pelo cliente como entrada e espera-se que retorne o valor desejado. |
Configurar opções do cliente
As opções do cliente podem ser configuradas no HubConnectionBuilder tipo (disponível nos clientes .NET e JavaScript). Ele também está disponível no cliente Java, mas a HttpHubConnectionBuilder subclasse é o que contém as opções de configuração do construtor, bem como no HubConnection próprio cliente.
Configurar registo de logs
O registro em log é configurado no cliente .NET usando o ConfigureLogging método. Os provedores e filtros de provisionamento de logs podem ser registados da mesma forma que no servidor. Consulte a documentação Logging in ASP.NET Core para obter mais informações.
Observação
Para registrar provedores de Log, você deve instalar os pacotes necessários. Consulte a seção Provedores de log internos dos documentos para obter uma lista completa.
Por exemplo, para habilitar o log do console, instale o Microsoft.Extensions.Logging.Console pacote NuGet. Chame o método de AddConsole extensão:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
No cliente JavaScript, existe um método semelhante configureLogging . Forneça um LogLevel valor que indique o nível mínimo de mensagens de log a serem produzidas. Os logs são gravados na janela do console do navegador.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
Em vez de um LogLevel valor, você também pode fornecer um string valor que represente um nome de nível de log. Isso é útil ao configurar os registos de SignalR em ambientes onde não tens acesso às LogLevel constantes.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
A tabela a seguir lista os níveis de log disponíveis. O valor fornecido para configureLogging define o nível mínimo de log que será registrado. As mensagens registradas nesse nível, ou os níveis listados depois dele na tabela, serão registradas.
| Cordão | Nível de Log |
|---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info
ouinformation |
LogLevel.Information |
warn
ouwarning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
Observação
Para desativar totalmente o signalR.LogLevel.None registro em log, especifique configureLogging no método.
Para obter mais informações sobre registo, consulte a Documentação deSignalR Diagnóstico.
O cliente SignalR Java utiliza a biblioteca SLF4J para registo. É uma API de registo de alto nível que permite que os utilizadores da biblioteca escolham a sua própria implementação específica de registo, adicionando uma dependência específica de registo. O trecho de código a seguir mostra como usar java.util.logging com o cliente SignalR Java.
implementation 'org.slf4j:slf4j-jdk14:1.7.25'
Se não configurar o registo das operações nas dependências, o SLF4J carregará um registador de não-operação padrão com a seguinte mensagem de aviso:
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.
Isso pode ser ignorado com segurança.
Configurar transportes permitidos
Os transportes utilizados por SignalR podem ser configurados na chamada WithUrl (withUrl em JavaScript). Um bitwise-OR dos valores de HttpTransportType pode ser usado para restringir o cliente a usar apenas os transportes especificados. Todos os transportes estão habilitados por padrão.
Por exemplo, para desativar o transporte de Eventos Server-Sent, mas permitir conexões WebSockets e Long Polling:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
No cliente JavaScript, os transportes são configurados definindo o transport campo no objeto options fornecido para withUrl:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
Nesta versão do cliente Java WebSockets é o único transporte disponível.
No cliente Java, o transporte é selecionado através do método withTransport no HttpHubConnectionBuilder. O cliente Java usa como padrão o transporte WebSockets.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
Observação
O SignalR cliente Java ainda não suporta alternativa de transporte.
Configurar a autenticação do portador
Para fornecer dados de autenticação junto com SignalR solicitações, use a AccessTokenProvider opção (accessTokenFactory em JavaScript) para especificar uma função que retorna o token de acesso desejado. No cliente .NET, este token de acesso é passado como um token de autenticação HTTP "Bearer" (usando o tipo Authorization no cabeçalho Bearer). No cliente JavaScript, o token de acesso é usado como um token Bearer, exceto em alguns casos onde as APIs do navegador restringem a possibilidade de aplicar cabeçalhos (especificamente, em Server-Sent Eventos e solicitações WebSockets). Nesses casos, o token de acesso é fornecido como um valor access_tokende cadeia de caracteres de consulta.
No cliente .NET, a AccessTokenProvider opção pode ser especificada usando as opções delegadas em WithUrl:
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", options => {
options.AccessTokenProvider = async () => {
// Get and return the access token.
};
})
.Build();
No cliente JavaScript, o token de acesso é configurado definindo o accessTokenFactory campo no objeto options em 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();
SignalR No cliente Java, você pode configurar um token de portador para usar para autenticação fornecendo uma fábrica de token de acesso ao HttpHubConnectionBuilder. Use withAccessTokenFactory para fornecer um RxJavaSingle<String>. Com uma chamada para Single.defer , você pode escrever a lógica para produzir tokens de acesso para o seu cliente.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withAccessTokenProvider(Single.defer(() -> {
// Your logic here.
return Single.just("An Access Token");
})).build();
Configurar opções de tempo limite e persistência de conexão
Opções adicionais para configurar o tempo limite e o comportamento manter-vivo estão disponíveis no próprio objeto:
| Opção | Valor predefinido | Descrição |
|---|---|---|
ServerTimeout |
30 segundos (30.000 milissegundos) | Tempo limite para a atividade do servidor. Se o servidor não tiver enviado uma mensagem nesse intervalo, o cliente considerará o servidor desconectado e acionará o Closed evento (onclose em JavaScript). Esse valor deve ser grande o suficiente para que uma mensagem de ping seja enviada do servidor e recebida pelo cliente dentro do intervalo de tempo limite. O valor recomendado é um número pelo menos o dobro do valor do KeepAliveInterval do servidor para permitir que os pings cheguem a tempo. |
HandshakeTimeout |
15 segundos | Tempo limite para o handshake inicial do servidor. Se o servidor não enviar uma resposta de handshake nesse intervalo, o cliente cancelará o handshake e acionará o Closed evento (onclose em JavaScript). Esta é uma configuração avançada que só deve ser modificada se estiverem ocorrendo erros de tempo limite de handshake devido à latência grave da rede. Para obter mais detalhes sobre o processo de handshake, consulte a Especificação do SignalR protocolo Hub. |
KeepAliveInterval |
15 segundos | Determina o intervalo no qual o cliente envia mensagens ping. O envio de qualquer mensagem do cliente redefine o temporizador para o início do intervalo de tempo. Se o cliente não enviou uma mensagem no ClientTimeoutInterval conjunto no servidor, o servidor considera o cliente desconectado. |
No cliente .NET, os valores de tempo limite são especificados como TimeSpan.
Configurar opções adicionais
Opções adicionais podem ser configuradas no método WithUrl (withUrl em JavaScript) no HubConnectionBuilder ou nas várias APIs de configuração no cliente Java HttpHubConnectionBuilder.
| Opção .NET | Valor predefinido | Descrição |
|---|---|---|
AccessTokenProvider |
null |
Uma função que retorna uma cadeia de caracteres que é fornecida como um token de autenticação Bearer em solicitações HTTP. |
SkipNegotiation |
false |
Defina isso para true para pular a etapa de negociação.
Suportado apenas quando o transporte WebSockets é o único transporte habilitado. Essa configuração não pode ser habilitada ao usar o Serviço do Azure SignalR . |
ClientCertificates |
Vazio | Uma coleção de certificados TLS para enviar para autenticar solicitações. |
Cookies |
Vazio | Uma coleção de cookies HTTP para enviar com cada solicitação HTTP. |
Credentials |
Vazio | Credenciais para enviar com cada solicitação HTTP. |
CloseTimeout |
5 segundos | Apenas WebSockets. A quantidade máxima de tempo que o cliente aguarda após o fechamento para que o servidor confirme a solicitação de fechamento. Se o servidor não reconhecer o fechamento dentro desse período, o cliente se desconectará. |
Headers |
Vazio | Um mapa de cabeçalhos HTTP adicionais para enviar com cada solicitação HTTP. |
HttpMessageHandlerFactory |
null |
Um delegado que pode ser usado para configurar ou substituir o HttpMessageHandler usado para enviar solicitações HTTP. Não usado para conexões WebSocket. Esse delegado deve retornar um valor não nulo e recebe o valor padrão como um parâmetro. Modifique as configurações nesse valor padrão e devolva-o ou retorne uma nova HttpMessageHandler instância.
Ao substituir o manipulador, certifique-se de copiar as configurações que deseja manter do manipulador fornecido, caso contrário, as opções configuradas (como Cookies e Cabeçalhos) não se aplicarão ao novo manipulador. |
Proxy |
null |
Um proxy HTTP para usar ao enviar solicitações HTTP. |
UseDefaultCredentials |
false |
Defina esse booleano para enviar as credenciais padrão para solicitações HTTP e WebSockets. Isso permite o uso da autenticação do Windows. |
WebSocketConfiguration |
null |
Um delegado que pode ser usado para configurar opções adicionais de WebSocket. Recebe uma instância de ClientWebSocketOptions que pode ser usada para configurar as opções. |
ApplicationMaxBufferSize |
1 MB | O número máximo de bytes recebidos do servidor que o cliente armazena em buffer antes de aplicar backpressure. Aumentar esse valor permite que o cliente receba mensagens maiores mais rapidamente sem aplicar backpressure, mas pode aumentar o consumo de memória. |
TransportMaxBufferSize |
1 MB | O número máximo de bytes enviados pela aplicação do utilizador que o cliente armazena em buffer antes de observar a "backpressure". Aumentar este valor permite que o cliente armazene mensagens maiores em buffer mais rapidamente sem ter de lidar com o backpressure, mas pode aumentar o consumo de memória. |
No cliente .NET, essas opções podem ser modificadas pelo delegado de opções fornecido para 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();
No Cliente JavaScript, essas opções podem ser fornecidas em um objeto JavaScript fornecido para 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();
No cliente Java, essas opções podem ser configuradas com os métodos no HttpHubConnectionBuilder retornados pelo HubConnectionBuilder.create("HUB URL").
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();