Usare Servizio Azure SignalR
Questo articolo illustra come usare l'SDK sul lato server dell'app per connettersi a Servizio SignalR quando si usa SignalR nel server app.
Importante
Le stringa di connessione non elaborate vengono visualizzate in questo articolo solo a scopo dimostrativo.
Un stringa di connessione include le informazioni di autorizzazione necessarie per consentire all'applicazione di accedere alle Servizio Azure SignalR. La chiave di accesso all'interno della stringa di connessione è simile a una password radice per il servizio. Negli ambienti di produzione proteggere sempre le chiavi di accesso. Usare Azure Key Vault per gestire e ruotare le chiavi in modo sicuro e proteggere i stringa di connessione usando Microsoft Entra ID e autorizzare l'accesso con Microsoft Entra ID.
Evitare di distribuire le chiavi di accesso ad altri utenti, impostarle come hardcoded o salvarle in un file di testo normale accessibile ad altri. Ruotare le chiavi se si ritiene che siano state compromesse.
Creare un'istanza del servizio Azure SignalR
Seguire Avvio rapido: Usare un modello di Resource Manager per distribuire Azure SignalR per creare un'istanza del servizio SignalR.
Per ASP.NET Core SignalR
Installazione dell'SDK
Eseguire il comando per installare Servizio SignalR SDK nel progetto ASP.NET Core.
dotnet add package Microsoft.Azure.SignalR
Startup
Nella classe usare Servizio SignalR SDK come frammento di codice seguente.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR()
.AddAzureSignalR();
}
public void Configure(IApplicationBuilder app)
{
app.UseEndpoints(routes =>
{
routes.MapHub<YourHubClass>("/path_for_your_hub");
});
}
Configurare la stringa di connessione
Le stringa di connessione non elaborate vengono visualizzate in questo articolo solo a scopo dimostrativo. Negli ambienti di produzione proteggere sempre le chiavi di accesso. Usare Azure Key Vault per gestire e ruotare le chiavi in modo sicuro e proteggere i stringa di connessione usando Microsoft Entra ID e autorizzare l'accesso con Microsoft Entra ID.
Esistono due approcci per configurare le stringa di connessione di Servizio SignalR nell'applicazione.
Impostare una variabile di ambiente con nome
Azure:SignalR:ConnectionString
oAzure__SignalR__ConnectionString
.- In app Azure Servizio inserirlo nelle impostazioni dell'applicazione.
Passare il stringa di connessione come parametro di
AddAzureSignalR()
.services.AddSignalR() .AddAzureSignalR("<replace with your connection string>");
or
services.AddSignalR() .AddAzureSignalR(options => options.ConnectionString = "<replace with your connection string>");
Configurare le opzioni
Sono disponibili alcune opzioni che è possibile personalizzare quando si usa Servizio Azure SignalR SDK.
ConnectionString
- Il valore predefinito è o
Azure:SignalR:ConnectionString
connectionString
appSetting
nelweb.config
file. - Può essere riconfigurato, ma assicurarsi che il valore non sia hardcoded.
InitialHubServerConnectionCount
- Il valore predefinito è
5
. - Questa opzione controlla il numero iniziale di connessioni per hub tra server applicazioni e Servizio Azure SignalR. In genere, mantenerlo come valore predefinito è sufficiente. Durante il runtime, l'SDK potrebbe avviare nuove connessioni server per l'ottimizzazione delle prestazioni o il bilanciamento del carico. Quando si dispone di un numero elevato di client, è possibile assegnargli un numero maggiore per una maggiore velocità effettiva. Ad esempio, se si dispone di 100.000 client in totale, il numero di connessioni può essere aumentato a
10
o15
.
MaxHubServerConnectionCount
- Il valore predefinito è
null
. - Questa opzione controlla il numero massimo di connessioni consentite per hub tra il server applicazioni e Servizio Azure SignalR. Durante il runtime, l'SDK potrebbe avviare nuove connessioni server per l'ottimizzazione delle prestazioni o il bilanciamento del carico. Per impostazione predefinita, viene avviata una nuova connessione server ogni volta che è necessario. Quando è configurato il numero massimo di connessioni server consentite, l'SDK non avvia nuove connessioni quando il numero di connessioni server raggiunge il limite.
ApplicationName
- Il valore predefinito è
null
. - Questa opzione può essere utile quando si vuole condividere la stessa istanza di Azure SignalR per server app diversi contenenti gli stessi nomi di hub. Se non impostato, tutti i server app connessi vengono considerati istanze della stessa applicazione.
ClaimsProvider
- Il valore predefinito è
null
. - Questa opzione controlla le attestazioni da associare alla connessione client.
Viene usato quando Service SDK genera il token di accesso per il client nella richiesta negoziata del client.
Per impostazione predefinita, tutte le attestazioni
HttpContext.User
della richiesta negoziata sono riservate. È possibile accedervi all'indirizzoHub.Context.User
. - In genere è consigliabile lasciare questa opzione così come è. Assicurarsi di comprendere cosa accade prima di personalizzarlo.
AccessTokenLifetime
- Il valore predefinito è
1 hour
. - Questa opzione controlla la durata valida del token di accesso, che Service SDK genera per ogni client. Il token di accesso viene restituito nella risposta alla richiesta negoziata del client.
- Quando
ServerSentEvent
oLongPolling
viene usato come trasporto, la connessione client verrà chiusa a causa di un errore di autenticazione dopo la scadenza. È possibile aumentare questo valore per evitare la disconnessione del client.
AccessTokenAlgorithm
- Il valore predefinito è
HS256
. - Questa opzione consente di scegliere quando si genera il token di
SecurityAlgorithms
accesso. Ora i valori facoltativi supportati sonoHS256
eHS512
. Si noti cheHS512
è più sicuro, ma il token generato è relativamente più lungo di quello che usaHS256
.
ServerStickyMode
- Il valore predefinito è
Disabled
. - Questa opzione specifica la modalità per il server sticky. Quando il client viene indirizzato al server con cui negozia per la prima volta, viene chiamato server sticky.
- Negli scenari distribuiti è possibile connettere più server app a un'istanza di Azure SignalR. Come spiegano gli elementi interni delle connessioni client, il client negozia prima con il server app e quindi reindirizza ad Azure SignalR per stabilire la connessione permanente. Azure SignalR trova quindi un server app per gestire il client, come spiega Transport Data between client and server (Dati di trasporto tra client e server ).
- Quando
Disabled
, il client instrada a un server app casuale. In generale, i server app hanno connessioni client bilanciate con questa modalità. Se gli scenari vengono trasmessi o inviati da gruppi, usare questa opzione predefinita. - Quando
Preferred
, Azure SignalR tenta di trovare il server app con cui il client negozia per la prima volta in modo che non sia necessario alcun altro costo o routing globale. Questo può essere utile quando lo scenario viene inviato alla connessione*. L'invio alla connessione può avere prestazioni migliori e una latenza inferiore quando il mittente e il ricevitore vengono instradati allo stesso server app. - Quando
Required
, Azure SignalR tenta sempre di trovare il server app con cui il client negozia per la prima volta. Questa opzione può essere utile quando un contesto client viene recuperato dalnegotiate
passaggio e archiviato in memoria e quindi da usare all'internoHub
di s. Tuttavia, questa opzione potrebbe avere svantaggi delle prestazioni perché richiede azure SignalR di intraprendere altre attività per trovare questo particolare server app a livello globale e per mantenere il routing globale dei traffici tra client e server.
- Quando
GracefulShutdown
GracefulShutdown.Mode
- Il valore predefinito è
Off
. - Questa opzione specifica il comportamento dopo che il server app riceve un SIGINT (CTRL+C).
- Se impostato su
WaitForClientsClose
, anziché arrestare immediatamente il server, viene rimosso dal Servizio Azure SignalR per impedire l'assegnazione di nuove connessioni client a questo server. - Se impostato su
MigrateClients
, si tenta inoltre di eseguire la migrazione delle connessioni client a un altro server valido. La migrazione verrà attivata solo dopo il recapito di un messaggio.OnConnected
eOnDisconnected
vengono attivati quando viene eseguita la migrazione delle connessioni in/out.IConnectionMigrationFeature
consente di identificare se la connessione viene migrata in/out.- Per informazioni dettagliate sull'utilizzo, vedere i codici di esempio.
GracefulShutdown.Timeout
- Il valore predefinito è
30 seconds
. - Questa opzione specifica il tempo più lungo in attesa della chiusura/migrazione dei client.
ServiceScaleTimeout
- Il valore predefinito è
5 minutes
. - Questa opzione specifica il tempo più lungo in attesa di endpoint del servizio di ridimensionamento dinamico, che influiscono almeno sui client online. In genere, la scalabilità dinamica tra un singolo server app e un endpoint di servizio può essere completata in pochi secondi, considerando anche se sono presenti più server app e più endpoint di servizio con jitter di rete e si vuole garantire la stabilità del client, è possibile configurare questo valore di conseguenza.
MaxPollIntervalInSeconds
- Il valore predefinito è
5
. - Questa opzione definisce l'intervallo massimo di polling consentito per
LongPolling
le connessioni in Servizio Azure SignalR. Se la richiesta di polling successiva non entra inMaxPollIntervalInSeconds
, Servizio Azure SignalR pulisce la connessione client. - Il valore è limitato a
[1, 300]
.
TransportTypeDetector
- Valore predefinito: tutti i trasporti sono abilitati.
- Questa opzione definisce una funzione per personalizzare i trasporti che i client possono usare per inviare richieste HTTP.
- Utilizzare queste opzioni anziché
HttpConnectionDispatcherOptions.Transports
per configurare i trasporti.
AllowStatefulReconnects
- Il valore predefinito è
null
. - Questa opzione abilita o disabilita le riconnessioni con stato per tutti gli hub.
- Se
null
, SDK leggerà le impostazioni dell'hub. - Se
true
, Servizio Azure SignalR abiliterà le riconnessioni con stato in tutti gli hub dichiarati. E i client devono abilitare le riconnessioni con stato sul lato client. - Se
false
, Servizio Azure SignalR disabiliterà le riconnessioni con stato in tutti gli hub dichiarati.
Esempio
È possibile configurare le opzioni precedenti come il codice di esempio seguente.
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;
});
Per l'ASP.NET Legacy SignalR
Nota
Se è la prima volta che si prova SignalR, è consigliabile usare il ASP.NET Core SignalR, è più semplice, affidabile e più facile da usare.
Installazione dell'SDK
Installare Servizio SignalR SDK nel progetto di ASP.NET con Gestione pacchetti Console:
Install-Package Microsoft.Azure.SignalR.AspNet
Startup
Nella classe usare Servizio SignalR SDK come frammento di codice seguente, sostituire MapSignalR()
con MapAzureSignalR({your_applicationName})
. Sostituire {YourApplicationName}
con il nome dell'applicazione, ovvero il nome univoco per distinguere questa applicazione con le altre applicazioni. È possibile usare this.GetType().FullName
come valore.
public void Configuration(IAppBuilder app)
{
app.MapAzureSignalR(this.GetType().FullName);
}
Configurare la stringa di connessione
Impostare il stringa di connessione nel web.config
file sulla connectionStrings
sezione :
<configuration>
<connectionStrings>
<add name="Azure:SignalR:ConnectionString" connectionString="Endpoint=...;AccessKey=..."/>
</connectionStrings>
...
</configuration>
Configurare le opzioni
Sono disponibili alcune opzioni che è possibile personalizzare quando si usa Servizio Azure SignalR SDK.
ConnectionString
- Il valore predefinito è o
Azure:SignalR:ConnectionString
connectionString
appSetting
nelweb.config
file. - Può essere riconfigurato, ma assicurarsi che il valore non sia hardcoded.
InitialHubServerConnectionCount
- Il valore predefinito è
5
. - Questa opzione controlla il numero iniziale di connessioni per hub tra server applicazioni e Servizio Azure SignalR. In genere, mantenerlo come valore predefinito è sufficiente. Durante il runtime, l'SDK potrebbe avviare nuove connessioni server per l'ottimizzazione delle prestazioni o il bilanciamento del carico. Quando si dispone di un numero elevato di client, è possibile assegnargli un numero maggiore per una maggiore velocità effettiva. Ad esempio, se si dispone di 100.000 client in totale, il numero di connessioni può essere aumentato a
10
o15
.
MaxHubServerConnectionCount
- Il valore predefinito è
null
. - Questa opzione controlla il numero massimo di connessioni consentite per hub tra il server applicazioni e Servizio Azure SignalR. Durante il runtime, l'SDK potrebbe avviare nuove connessioni server per l'ottimizzazione delle prestazioni o il bilanciamento del carico. Per impostazione predefinita, viene avviata una nuova connessione server ogni volta che è necessario. Quando è configurato il numero massimo di connessioni server consentite, l'SDK non avvia nuove connessioni quando il numero di connessioni server raggiunge il limite.
ApplicationName
- Il valore predefinito è
null
. - Questa opzione può essere utile quando si vuole condividere la stessa istanza di Azure SignalR per server app diversi contenenti gli stessi nomi di hub. Se non impostato, tutti i server app connessi vengono considerati istanze della stessa applicazione.
ClaimProvider
- Il valore predefinito è
null
. - Questa opzione controlla le attestazioni da associare alla connessione client.
Viene usato quando Service SDK genera il token di accesso per il client nella richiesta negoziata del client.
Per impostazione predefinita, tutte le attestazioni
IOwinContext.Authentication.User
della richiesta negoziata sono riservate. - In genere è consigliabile lasciare questa opzione così come è. Assicurarsi di comprendere cosa accade prima di personalizzarlo.
AccessTokenLifetime
- Il valore predefinito è
1 hour
. - Questa opzione controlla la durata valida del token di accesso, generato da Service SDK per ogni client. Il token di accesso viene restituito nella risposta alla richiesta negoziata del client.
- Quando
ServerSentEvent
oLongPolling
viene usato come trasporto, la connessione client verrà chiusa a causa di un errore di autenticazione dopo la scadenza. È possibile aumentare questo valore per evitare la disconnessione del client.
AccessTokenAlgorithm
- Il valore predefinito è
HS256
. - Questa opzione consente di scegliere quando si genera il token di
SecurityAlgorithms
accesso. Ora i valori facoltativi supportati sonoHS256
eHS512
. Si noti cheHS512
è più sicuro, ma il token generato è relativamente più lungo di quello che usaHS256
.
ServerStickyMode
- Il valore predefinito è
Disabled
. - Questa opzione specifica la modalità per il server sticky. Quando il client viene indirizzato al server con cui negozia per la prima volta, viene chiamato server sticky.
- Negli scenari distribuiti è possibile connettere più server app a un'istanza di Azure SignalR. Come spiegano gli elementi interni delle connessioni client, il client negozia prima con il server app e quindi reindirizza ad Azure SignalR per stabilire la connessione permanente. Azure SignalR trova quindi un server app per gestire il client, come spiega Transport Data between client and server (Dati di trasporto tra client e server ).
- Quando
Disabled
, il client instrada a un server app casuale. In generale, i server app hanno connessioni client bilanciate con questa modalità. Se gli scenari vengono trasmessi o inviati da gruppi, usare questa opzione predefinita. - Quando
Preferred
, Azure SignalR tenta di trovare il server app con cui il client negozia per la prima volta in modo che non sia necessario alcun altro costo o routing globale. Questo può essere utile quando lo scenario viene inviato alla connessione*. L'invio alla connessione può avere prestazioni migliori e una latenza inferiore quando il mittente e il ricevitore vengono instradati allo stesso server app. - Quando
Required
, Azure SignalR tenta sempre di trovare il server app con cui il client negozia per la prima volta. Questa opzione può essere utile quando un contesto client viene recuperato dalnegotiate
passaggio e archiviato in memoria e quindi da usare all'internoHub
di s. Tuttavia, questa opzione potrebbe avere svantaggi delle prestazioni perché richiede azure SignalR di intraprendere altre attività per trovare questo particolare server app a livello globale e per mantenere il routing globale dei traffici tra client e server.
- Quando
MaxPollIntervalInSeconds
- Il valore predefinito è
5
. - Questa opzione definisce il tempo di inattività massimo consentito per le connessioni inattive in Servizio Azure SignalR. In ASP.NET SignalR, si applica al tipo di trasporto di polling lungo o alla riconnessione. Se la richiesta o
/poll
successiva/reconnect
non entra inMaxPollIntervalInSeconds
, Servizio Azure SignalR pulisce la connessione client. - Il valore è limitato a
[1, 300]
.
Esempio
È possibile configurare le opzioni precedenti come il codice di esempio seguente.
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;
}));
Scalabilità orizzontale del server applicazioni
Con Servizio Azure SignalR, le connessioni permanenti vengono scaricate dal server applicazioni in modo da potersi concentrare sull'implementazione della logica di business nelle classi hub. Tuttavia, è comunque necessario aumentare le prestazioni dei server applicazioni per migliorare le prestazioni quando si gestiscono connessioni client di grandi dimensioni. Di seguito sono riportati alcuni suggerimenti per la scalabilità orizzontale dei server applicazioni.
- Più server applicazioni possono connettersi alla stessa istanza di Servizio Azure SignalR.
- Se si vuole condividere la stessa istanza di Azure SignalR per applicazioni diverse contenenti gli stessi nomi di hub, impostarli con un'opzione ApplicationName diversa. Se non impostato, tutti i server app connessi vengono considerati istanze della stessa applicazione.
- Purché l'opzione ApplicationName e il nome della classe hub corrispondano, le connessioni da server applicazioni diversi vengono raggruppate nello stesso hub.
- Ogni connessione client viene creata solo in uno dei server applicazioni e i messaggi provenienti da tale client vengono inviati solo allo stesso server applicazioni. Se si desidera accedere alle informazioni client a livello globale (da tutti i server applicazioni), è necessario usare alcune risorse di archiviazione centralizzate per salvare le informazioni client da tutti i server applicazioni.
Passaggi successivi
Questo articolo illustra come usare Servizio SignalR nelle applicazioni. Per altre informazioni sulle Servizio SignalR, vedere gli articoli seguenti.