Usar o Serviço Azure SignalR
Este artigo mostra como usar o SDK no lado do servidor de aplicativos para se conectar ao Serviço SignalR quando você estiver usando o SignalR no servidor de aplicativos.
Importante
As cadeias de conexão brutas aparecem neste artigo apenas para fins de demonstração.
Uma cadeia de conexão inclui as informações de autorização necessárias para seu aplicativo acessar o serviço Azure Web PubSub. A chave de acesso dentro da cadeia de conexão é semelhante a uma senha de root para o seu serviço. Em ambientes de produção, proteja sempre as suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua cadeia de conexão usando a ID do Microsoft Entra e autorizar o acesso com a ID do Microsoft Entra.
Evite distribuir chaves de acesso para outros usuários, codificá-las ou salvá-las em qualquer lugar em texto simples acessível a outras pessoas. Rode as chaves se acreditar que podem ter sido comprometidas.
Criar uma instância do Azure SignalR Service
Siga Guia de início rápido: use um modelo ARM para implantar o Azure SignalR para criar uma instância de serviço do SignalR.
Para ASP.NET Core SignalR
Instale o SDK
Execute o comando para instalar o SDK do SignalR Service no seu projeto ASP.NET Core.
dotnet add package Microsoft.Azure.SignalR
Em sua Startup
classe, use o SDK do Serviço SignalR como o trecho de código a seguir.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR()
.AddAzureSignalR();
}
public void Configure(IApplicationBuilder app)
{
app.UseEndpoints(routes =>
{
routes.MapHub<YourHubClass>("/path_for_your_hub");
});
}
Configurar cadeia de conexão
As cadeias de conexão brutas aparecem neste artigo apenas para fins de demonstração. Em ambientes de produção, proteja sempre as suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua cadeia de conexão usando a ID do Microsoft Entra e autorizar o acesso com a ID do Microsoft Entra.
Há duas abordagens para configurar a cadeia de conexão do Serviço SignalR em seu aplicativo.
Defina uma variável de ambiente com nome
Azure:SignalR:ConnectionString
ouAzure__SignalR__ConnectionString
.- No Serviço de Aplicativo do Azure, coloque-o nas configurações do aplicativo.
Passe a cadeia de conexão como um parâmetro de
AddAzureSignalR()
.services.AddSignalR() .AddAzureSignalR("<replace with your connection string>");
ou
services.AddSignalR() .AddAzureSignalR(options => options.ConnectionString = "<replace with your connection string>");
Configurar opções
Há algumas opções que você pode personalizar ao usar o SDK do Serviço Azure SignalR.
ConnectionString
- O valor padrão é o
Azure:SignalR:ConnectionString
connectionString
ouappSetting
noweb.config
arquivo. - Ele pode ser reconfigurado, mas certifique-se de que o valor NÃO está codificado.
InitialHubServerConnectionCount
- O valor predefinido é
5
. - Esta opção controla a contagem inicial de conexões por hub entre o servidor de aplicativos e o Serviço Azure SignalR. Normalmente, mantenha-o, pois o valor padrão é suficiente. Durante o tempo de execução, o SDK pode iniciar novas conexões de servidor para ajuste de desempenho ou balanceamento de carga. Quando você tem um grande número de clientes, você pode dar-lhe um número maior para uma melhor taxa de transferência. Por exemplo, se você tiver 100.000 clientes no total, a contagem de conexões poderá ser aumentada para
10
ou15
.
MaxHubServerConnectionCount
- O valor predefinido é
null
. - Esta opção controla a contagem máxima de conexões permitidas por hub entre o servidor de aplicativos e o Serviço Azure SignalR. Durante o tempo de execução, o SDK pode iniciar novas conexões de servidor para ajuste de desempenho ou balanceamento de carga. Por padrão, uma nova conexão de servidor é iniciada sempre que necessário. Quando a contagem máxima de conexões de servidor permitida é configurada, o SDK não inicia novas conexões quando a contagem de conexões do servidor atinge o limite.
ApplicationName
- O valor predefinido é
null
. - Essa opção pode ser útil quando você deseja compartilhar a mesma instância do Azure SignalR para diferentes servidores de aplicativos que contêm os mesmos nomes de hub. Se não estiver definido, todos os servidores de aplicativos conectados serão considerados instâncias do mesmo aplicativo.
ClaimsProvider
- O valor predefinido é
null
. - Esta opção controla quais declarações você deseja associar à conexão do cliente.
Ele é usado quando o Service SDK gera token de acesso para o cliente na solicitação de negociação do cliente.
Por padrão, todas as reivindicações da solicitação negociada
HttpContext.User
são reservadas. Eles podem ser acessados emHub.Context.User
. - Normalmente, deve deixar esta opção como está. Certifique-se de entender o que acontece antes de personalizá-lo.
AccessTokenLifetime
- O valor predefinido é
1 hour
. - Esta opção controla o tempo de vida válido do token de acesso que o Service SDK gera para cada cliente. O token de acesso é retornado na resposta à solicitação de negociação do cliente.
- Quando
ServerSentEvent
ouLongPolling
é usado como transporte, a conexão do cliente será fechada devido a falha de autenticação após o tempo expirado. Você pode aumentar esse valor para evitar a desconexão do cliente.
AccessTokenAlgorithm
- O valor padrão é
HS256
- Esta opção oferece a opção de quando gerar token de
SecurityAlgorithms
acesso. Agora os valores opcionais suportados sãoHS256
eHS512
. Observe queHS512
é mais seguro, mas o token gerado é comparativamente mais longo do que o que usaHS256
o .
ServerStickyMode
- O valor predefinido é
Disabled
. - Esta opção especifica o modo para o servidor sticky. Quando o cliente é roteado para o servidor com o qual negocia primeiro, chamamos de servidor sticky.
- Em cenários distribuídos, pode haver vários servidores de aplicativos conectados a uma instância do Azure SignalR. Como explicam os internos das conexões do cliente, o cliente primeiro negocia com o servidor do aplicativo e, em seguida, redireciona para o Azure SignalR para estabelecer a conexão persistente. Em seguida, o Azure SignalR localiza um servidor de aplicativos para atender o cliente, como explica os Dados de Transporte entre o cliente e o servidor .
- Quando
Disabled
, o cliente roteia para um servidor de aplicativo aleatório. Em geral, os servidores de aplicativos têm conexões de cliente equilibradas com esse modo. Se os cenários forem de difusão ou envio de grupo, use esta opção padrão é suficiente. - Quando
Preferred
o , o Azure SignalR tenta localizar o servidor de aplicativos com o qual o cliente negocia primeiro de uma forma que nenhum outro custo ou roteamento global seja necessário. Este pode ser útil quando o seu cenário é enviado para a conexão*. Enviar para conexão pode ter melhor desempenho e menor latência quando o remetente e o recetor são roteados para o mesmo servidor de aplicativo. - Quando
Required
o , o Azure SignalR sempre tenta localizar o servidor de aplicativos com o qual o cliente negocia primeiro. Essa opção pode ser útil quando algum contexto de cliente é buscado na etapa e armazenado na memória e, em seguida, para ser usado dentroHub
denegotiate
s. No entanto, essa opção pode ter desvantagens de desempenho porque exige que o Azure SignalR faça outros esforços para encontrar esse servidor de aplicativos específico globalmente e para manter o roteamento global de tráfegos entre cliente e servidor.
- Quando
GracefulShutdown
GracefulShutdown.Mode
- O valor padrão é
Off
- Esta opção especifica o comportamento depois que o servidor de aplicativos recebe um SIGINT (CTRL + C).
- Quando definido como
WaitForClientsClose
, em vez de parar o servidor imediatamente, nós o removemos do Serviço Azure SignalR para impedir que novas conexões de cliente sejam atribuídas a esse servidor. - Quando definido como
MigrateClients
, além disso, tentamos migrar conexões de cliente para outro servidor válido. A migração será acionada somente depois que uma mensagem for entregue.OnConnected
eOnDisconnected
são acionados quando as conexões são migradas para dentro/para fora.IConnectionMigrationFeature
pode ajudá-lo a identificar se a conexão é migrada para dentro/para fora.- Veja nossos códigos de exemplo para uso detalhado.
GracefulShutdown.Timeout
- O valor padrão é
30 seconds
- Esta opção especifica o maior tempo de espera para que os clientes sejam fechados/migrados.
ServiceScaleTimeout
- O valor padrão é
5 minutes
- Esta opção especifica o maior tempo de espera por pontos de extremidade de serviço de dimensionamento dinâmico, que afetam, no mínimo, os clientes online. Normalmente, a escala dinâmica entre um único servidor de aplicativo e um ponto de extremidade de serviço pode ser concluída em segundos, considerando que, se você tiver vários servidores de aplicativos e vários pontos de extremidade de serviço com jitter de rede e quiser garantir a estabilidade do cliente, poderá configurar esse valor de acordo.
MaxPollIntervalInSeconds
- O valor padrão é
5
- Esta opção define o intervalo máximo de sondagem permitido para
LongPolling
conexões no Serviço SignalR do Azure. Se a próxima solicitação de pesquisa não chegarMaxPollIntervalInSeconds
, o Serviço Azure SignalR limpará a conexão do cliente. - O valor é limitado a
[1, 300]
.
TransportTypeDetector
- Valor padrão: Todos os transportes estão habilitados.
- Esta opção define uma função para personalizar os transportes que os clientes podem usar para enviar solicitações HTTP.
- Use essas opções em vez de
HttpConnectionDispatcherOptions.Transports
configurar transportes.
AllowStatefulReconnects
- O valor padrão é
null
- Essa opção habilita ou desabilita reconexões com monitoração de estado para todos os hubs.
- Se
null
o SDK ler as configurações do hub. - Se
true
o Serviço Azure SignalR habilitar reconexões com monitoração de estado em todos os hubs declarados. E os clientes precisam habilitar reconexões com monitoração de estado no lado do cliente. - Se
false
o Serviço Azure SignalR desabilitar as reconexões com monitoração de estado em todos os hubs declarados.
Exemplo
Você pode configurar as opções acima, como o código de exemplo a seguir.
services.AddSignalR()
.AddAzureSignalR(options =>
{
options.InitialHubServerConnectionCount = 10;
options.AccessTokenLifetime = TimeSpan.FromDays(1);
options.ClaimsProvider = context => context.User.Claims;
options.GracefulShutdown.Mode = GracefulShutdownMode.WaitForClientsClose;
options.GracefulShutdown.Timeout = TimeSpan.FromSeconds(10);
options.TransportTypeDetector = httpContext => AspNetCore.Http.Connections.HttpTransportType.WebSockets | AspNetCore.Http.Connections.HttpTransportType.LongPolling;
});
Para o legado ASP.NET SignalR
Nota
Se é a primeira vez que experimenta o SignalR, recomendamos que utilize o ASP.NET Core SignalR, que é mais simples, mais fiável e mais fácil de utilizar.
Instale o SDK
Instale o SDK do Serviço SignalR em seu projeto ASP.NET com o Console do Gerenciador de Pacotes:
Install-Package Microsoft.Azure.SignalR.AspNet
Em sua Startup
classe, use o SDK do Serviço SignalR como o seguinte trecho de código, substitua MapSignalR()
por MapAzureSignalR({your_applicationName})
. Substitua {YourApplicationName}
para o nome do seu aplicativo, este é o nome exclusivo para distinguir este aplicativo de seus outros aplicativos. Você pode usar this.GetType().FullName
como o valor.
public void Configuration(IAppBuilder app)
{
app.MapAzureSignalR(this.GetType().FullName);
}
Configurar cadeia de conexão
Defina a cadeia de conexão no web.config
arquivo para a connectionStrings
seção :
<configuration>
<connectionStrings>
<add name="Azure:SignalR:ConnectionString" connectionString="Endpoint=...;AccessKey=..."/>
</connectionStrings>
...
</configuration>
Configurar opções
Há algumas opções que você pode personalizar ao usar o SDK do Serviço Azure SignalR.
ConnectionString
- O valor padrão é o
Azure:SignalR:ConnectionString
connectionString
ouappSetting
noweb.config
arquivo. - Ele pode ser reconfigurado, mas certifique-se de que o valor NÃO está codificado.
InitialHubServerConnectionCount
- O valor predefinido é
5
. - Esta opção controla a contagem inicial de conexões por hub entre o servidor de aplicativos e o Serviço Azure SignalR. Normalmente, mantenha-o, pois o valor padrão é suficiente. Durante o tempo de execução, o SDK pode iniciar novas conexões de servidor para ajuste de desempenho ou balanceamento de carga. Quando você tem um grande número de clientes, você pode dar-lhe um número maior para uma melhor taxa de transferência. Por exemplo, se você tiver 100.000 clientes no total, a contagem de conexões poderá ser aumentada para
10
ou15
.
MaxHubServerConnectionCount
- O valor predefinido é
null
. - Esta opção controla a contagem máxima de conexões permitidas por hub entre o servidor de aplicativos e o Serviço Azure SignalR. Durante o tempo de execução, o SDK pode iniciar novas conexões de servidor para ajuste de desempenho ou balanceamento de carga. Por padrão, uma nova conexão de servidor é iniciada sempre que necessário. Quando a contagem máxima de conexões de servidor permitida é configurada, o SDK não inicia novas conexões quando a contagem de conexões do servidor atinge o limite.
ApplicationName
- O valor predefinido é
null
. - Essa opção pode ser útil quando você deseja compartilhar a mesma instância do Azure SignalR para diferentes servidores de aplicativos que contêm os mesmos nomes de hub. Se não estiver definido, todos os servidores de aplicativos conectados serão considerados instâncias do mesmo aplicativo.
ClaimProvider
- O valor predefinido é
null
. - Esta opção controla quais declarações você deseja associar à conexão do cliente.
Ele é usado quando o Service SDK gera token de acesso para o cliente na solicitação de negociação do cliente.
Por padrão, todas as reivindicações da solicitação negociada
IOwinContext.Authentication.User
são reservadas. - Normalmente, deve deixar esta opção como está. Certifique-se de entender o que acontece antes de personalizá-lo.
AccessTokenLifetime
- O valor predefinido é
1 hour
. - Esta opção controla o tempo de vida válido do token de acesso, que o Service SDK gera para cada cliente. O token de acesso é retornado na resposta à solicitação de negociação do cliente.
- Quando
ServerSentEvent
ouLongPolling
é usado como transporte, a conexão do cliente será fechada devido a falha de autenticação após o tempo expirado. Você pode aumentar esse valor para evitar a desconexão do cliente.
AccessTokenAlgorithm
- O valor padrão é
HS256
- Esta opção oferece a opção de quando gerar token de
SecurityAlgorithms
acesso. Agora os valores opcionais suportados sãoHS256
eHS512
. Observe queHS512
é mais seguro, mas o token gerado é comparativamente mais longo do que o que usaHS256
o .
ServerStickyMode
- O valor predefinido é
Disabled
. - Esta opção especifica o modo para o servidor sticky. Quando o cliente é roteado para o servidor com o qual negocia primeiro, chamamos de servidor sticky.
- Em cenários distribuídos, pode haver vários servidores de aplicativos conectados a uma instância do Azure SignalR. Como explicam os internos das conexões do cliente, o cliente primeiro negocia com o servidor do aplicativo e, em seguida, redireciona para o Azure SignalR para estabelecer a conexão persistente. Em seguida, o Azure SignalR localiza um servidor de aplicativos para atender o cliente, como explica os Dados de Transporte entre o cliente e o servidor .
- Quando
Disabled
, o cliente roteia para um servidor de aplicativo aleatório. Em geral, os servidores de aplicativos têm conexões de cliente equilibradas com esse modo. Se os cenários forem de difusão ou envio de grupo, use esta opção padrão é suficiente. - Quando
Preferred
o , o Azure SignalR tenta localizar o servidor de aplicativos com o qual o cliente negocia primeiro de uma forma que nenhum outro custo ou roteamento global seja necessário. Este pode ser útil quando o seu cenário é enviado para a conexão*. Enviar para conexão pode ter melhor desempenho e menor latência quando o remetente e o recetor são roteados para o mesmo servidor de aplicativo. - Quando
Required
o , o Azure SignalR sempre tenta localizar o servidor de aplicativos com o qual o cliente negocia primeiro. Essa opção pode ser útil quando algum contexto de cliente é buscado na etapa e armazenado na memória e, em seguida, para ser usado dentroHub
denegotiate
s. No entanto, essa opção pode ter desvantagens de desempenho porque exige que o Azure SignalR faça outros esforços para encontrar esse servidor de aplicativos específico globalmente e para manter o roteamento global de tráfegos entre cliente e servidor.
- Quando
MaxPollIntervalInSeconds
- O valor padrão é
5
- Esta opção define o tempo ocioso máximo permitido para conexões inativas no Serviço Azure SignalR. No ASP.NET SignalR, ele se aplica ao tipo de transporte de sondagem longa ou reconexão. Se a próxima
/reconnect
solicitação ou/poll
não entrar no ,MaxPollIntervalInSeconds
o Serviço SignalR do Azure limpará a conexão do cliente. - O valor é limitado a
[1, 300]
.
Exemplo
Você pode configurar as opções acima, como o código de exemplo a seguir.
app.Map("/signalr",subApp => subApp.RunAzureSignalR(this.GetType().FullName, new HubConfiguration(), options =>
{
options.InitialHubServerConnectionCount = 1;
options.AccessTokenLifetime = TimeSpan.FromDays(1);
options.ClaimProvider = context => context.Authentication?.User.Claims;
}));
Dimensionar o servidor de aplicativos
Com o Serviço Azure SignalR, as conexões persistentes são descarregadas do servidor de aplicativos para que você possa se concentrar na implementação de sua lógica de negócios em classes de hub. Mas você ainda precisa expandir os servidores de aplicativos para obter um melhor desempenho ao lidar com conexões de clientes massivas. Abaixo estão algumas dicas para expandir servidores de aplicativos.
- Vários servidores de aplicativos podem se conectar à mesma instância do Serviço Azure SignalR.
- Se você quiser compartilhar a mesma instância do Azure SignalR para aplicativos diferentes que contenham os mesmos nomes de hub, defina-os com a opção ApplicationName diferente. Se não estiver definido, todos os servidores de aplicativos conectados serão considerados instâncias do mesmo aplicativo.
- Desde que a opção ApplicationName e o nome da classe de hub sejam os mesmos, as conexões de diferentes servidores de aplicativos são agrupadas no mesmo hub.
- Cada conexão de cliente é criada apenas em um dos servidores de aplicativos, e as mensagens desse cliente são enviadas apenas para esse mesmo servidor de aplicativos. Se você quiser acessar as informações do cliente globalmente (de todos os servidores de aplicativos), precisará usar algum armazenamento centralizado para salvar as informações do cliente de todos os servidores de aplicativos.
Próximos passos
Neste artigo, você aprenderá a usar o Serviço SignalR em seus aplicativos. Consulte os seguintes artigos para saber mais sobre o Serviço SignalR.