Partilhar via


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 ou Azure__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 ou appSetting no web.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 ou 15.

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 em Hub.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 ou LongPolling é 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ão HS256 e HS512. Observe que HS512 é mais seguro, mas o token gerado é comparativamente mais longo do que o que usa HS256o .

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 Preferredo , 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 Requiredo , 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 dentro Hubde negotiate 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.

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 e OnDisconnected 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 chegar MaxPollIntervalInSeconds, 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 nullo SDK ler as configurações do hub.
  • Se trueo 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 falseo 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 ou appSetting no web.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 ou 15.

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 ou LongPolling é 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ão HS256 e HS512. Observe que HS512 é mais seguro, mas o token gerado é comparativamente mais longo do que o que usa HS256o .

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 Preferredo , 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 Requiredo , 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 dentro Hubde negotiate 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.

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 , MaxPollIntervalInSecondso 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.