Ospitare e distribuire Blazor serverHost and deploy Blazor Server

Di Luke Latham, Rainer Stropek e Daniel RothBy Luke Latham, Rainer Stropek, and Daniel Roth

Valori di configurazione dell'hostHost configuration values

Blazor app Server possono accettare valori di configurazione host generici.Blazor Server apps can accept Generic Host configuration values.

DistribuzioneDeployment

Utilizzando il modello di hosting del server diBlazor, Blazor viene eseguito sul server dall'interno di un'app di ASP.NET Core.Using the Blazor Server hosting model, Blazor is executed on the server from within an ASP.NET Core app. Gli aggiornamenti dell'interfaccia utente, la gestione degli eventi e le chiamate JavaScript vengono gestiti tramite una connessione SignalR .UI updates, event handling, and JavaScript calls are handled over a SignalR connection.

È necessario un server Web in grado di ospitare un'app ASP.NET Core.A web server capable of hosting an ASP.NET Core app is required. Visual Studio include il modello di progetto app ServerBlazor (blazorserverside modello quando si usa il comando DotNet New ).Visual Studio includes the Blazor Server App project template (blazorserverside template when using the dotnet new command).

ScalabilitàScalability

Pianificare una distribuzione per sfruttare al meglio l'infrastruttura disponibile per un'app Server Blazor.Plan a deployment to make the best use of the available infrastructure for a Blazor Server app. Per informazioni sulla scalabilità delle app Server Blazor, vedere le risorse seguenti:See the following resources to address Blazor Server app scalability:

Server di distribuzioneDeployment server

Quando si considera la scalabilità di un singolo server (scalabilità verticale), la memoria disponibile per un'app è probabilmente la prima risorsa che verrà esaurita dall'app quando le richieste degli utenti aumentano.When considering the scalability of a single server (scale up), the memory available to an app is likely the first resource that the app will exhaust as user demands increase. La memoria disponibile sul server influiscono su:The available memory on the server affects the:

  • Numero di circuiti attivi che un server è in grado di supportare.Number of active circuits that a server can support.
  • Latenza dell'interfaccia utente nel client.UI latency on the client.

Per istruzioni sulla creazione di app Server Blazor sicure e scalabili, vedere Proteggere ASP.NET Core app Blazor server.For guidance on building secure and scalable Blazor server apps, see Proteggere ASP.NET Core app Blazor server.

Ogni circuito utilizza circa 250 KB di memoria per un'app di tipo Hello Worldminima.Each circuit uses approximately 250 KB of memory for a minimal Hello World-style app. La dimensione di un circuito dipende dal codice dell'app e dai requisiti di manutenzione dello stato associati a ogni componente.The size of a circuit depends on the app's code and the state maintenance requirements associated with each component. Si consiglia di misurare le richieste di risorse durante lo sviluppo dell'applicazione e dell'infrastruttura, ma la linea di base seguente può essere un punto di partenza per la pianificazione della destinazione di distribuzione: se si prevede che l'app supporti 5.000 utenti simultanei, prendere in considerazione il budget almeno 1,3 GB di memoria del server per l'app (o circa 273 KB per utente).We recommend that you measure resource demands during development for your app and infrastructure, but the following baseline can be a starting point in planning your deployment target: If you expect your app to support 5,000 concurrent users, consider budgeting at least 1.3 GB of server memory to the app (or ~273 KB per user).

configurazione di SignalRSignalR configuration

le app Server Blazor usano SignalR ASP.NET Core per comunicare con il browser.Blazor Server apps use ASP.NET Core SignalR to communicate with the browser. le condizioni di hosting e scalabilità diSignalR si applicano alle app Blazor server.SignalR's hosting and scaling conditions apply to Blazor Server apps.

Blazor funziona al meglio quando si usano WebSocket come il trasporto SignalR a causa di latenza, affidabilità e sicurezzainferiori. works best when using WebSockets as the SignalR transport due to lower latency, reliability, and security. Il polling prolungato viene usato da SignalR quando WebSocket non è disponibile o quando l'app è configurata in modo esplicito per l'uso del polling prolungato.Long Polling is used by SignalR when WebSockets isn't available or when the app is explicitly configured to use Long Polling. Quando si esegue la distribuzione nel servizio app Azure, configurare l'app per l'uso di WebSocket nelle impostazioni portale di Azure per il servizio.When deploying to Azure App Service, configure the app to use WebSockets in the Azure portal settings for the service. Per informazioni dettagliate sulla configurazione dell'app per il servizio app Azure, vedere le linee guidaper la pubblicazione diSignalR.For details on configuring the app for Azure App Service, see the SignalR publishing guidelines.

Servizio SignalR di AzureAzure SignalR Service

È consigliabile usare il servizio SignalR di Azure per le app Blazor server.We recommend using the Azure SignalR Service for Blazor Server apps. Il servizio consente di aumentare le prestazioni di un'app Server Blazor per un numero elevato di connessioni SignalR simultanee.The service allows for scaling up a Blazor Server app to a large number of concurrent SignalR connections. Inoltre, la portata globale del servizio SignalR e i Data Center a prestazioni elevate consentono di ridurre significativamente la latenza a causa della geografia.In addition, the SignalR service's global reach and high-performance data centers significantly aid in reducing latency due to geography. Per configurare un'app e, facoltativamente, effettuare il provisioning del servizio SignalR di Azure:To configure an app (and optionally provision) the Azure SignalR Service:

  1. Consentire al servizio di supportare le sessioni permanenti, in cui i client vengono reindirizzati allo stesso server durante il prerendering.Enable the service to support sticky sessions, where clients are redirected back to the same server when prerendering. Impostare l'opzione ServerStickyMode o il valore di configurazione su Required.Set the ServerStickyMode option or configuration value to Required. In genere, un'app crea la configurazione usando uno degli approcci seguenti:Typically, an app creates the configuration using one of the following approaches:

    • Startup.ConfigureServices:Startup.ConfigureServices:

      services.AddSignalR().AddAzureSignalR(options =>
      {
          options.ServerStickyMode = 
              Microsoft.Azure.SignalR.ServerStickyMode.Required;
      });
      
    • Configurazione (usare uno degli approcci seguenti):Configuration (use one of the following approaches):

      • appsettings.json:appsettings.json:

        "Azure:SignalR:ServerStickyMode": "Required"
        
      • La configurazione del servizio app > le impostazioni dell'applicazione nella portale di Azure (nome: Azure:SignalR:ServerStickyMode, valore: Required).The app service's Configuration > Application settings in the Azure portal (Name: Azure:SignalR:ServerStickyMode, Value: Required).

  2. Creare un profilo di pubblicazione per le app di Azure in Visual Studio per l'app Server Blazor.Create an Azure Apps publish profile in Visual Studio for the Blazor Server app.

  3. Aggiungere la dipendenza del servizio SignalR di Azure al profilo.Add the Azure SignalR Service dependency to the profile. Se la sottoscrizione di Azure non dispone di un'istanza del servizio SignalR di Azure esistente da assegnare all'app, selezionare Crea una nuova istanza del servizio SignalR di Azure per eseguire il provisioning di una nuova istanza del servizio.If the Azure subscription doesn't have a pre-existing Azure SignalR Service instance to assign to the app, select Create a new Azure SignalR Service instance to provision a new service instance.

  4. Pubblicare l'app in Azure.Publish the app to Azure.

IISIIS

Quando si usa IIS, abilitare:When using IIS, enable:

KubernetesKubernetes

Creare una definizione di ingresso con le annotazioni Kubernetes seguenti per le sessioni permanenti:Create an ingress definition with the following Kubernetes annotations for sticky sessions:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: <ingress-name>
  annotations:
    nginx.ingress.kubernetes.io/affinity: "cookie"
    nginx.ingress.kubernetes.io/session-cookie-name: "affinity"
    nginx.ingress.kubernetes.io/session-cookie-expires: "14400"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "14400"

Linux con NginxLinux with Nginx

Per il corretto funzionamento di SignalR WebSocket, verificare che le intestazioni Upgrade e Connection del proxy siano impostate sui valori seguenti e che sia stato eseguito il mapping di $connection_upgrade a:For SignalR WebSockets to function properly, confirm that the proxy's Upgrade and Connection headers are set to the following values and that $connection_upgrade is mapped to either:

  • Valore dell'intestazione di aggiornamento per impostazione predefinita.The Upgrade header value by default.
  • close quando l'intestazione di aggiornamento manca o è vuota.close when the Upgrade header is missing or empty.
http {
    map $http_upgrade $connection_upgrade {
        default Upgrade;
        ''      close;
    }

    server {
        listen      80;
        server_name example.com *.example.com
        location / {
            proxy_pass         http://localhost:5000;
            proxy_http_version 1.1;
            proxy_set_header   Upgrade $http_upgrade;
            proxy_set_header   Connection $connection_upgrade;
            proxy_set_header   Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Proto $scheme;
        }
    }
}

Per altre informazioni, vedere i seguenti articoli:For more information, see the following articles:

Misurare la latenza di reteMeasure network latency

L' interoperabilità JS può essere usata per misurare la latenza di rete, come illustrato nell'esempio seguente:JS interop can be used to measure network latency, as the following example demonstrates:

@inject IJSRuntime JS

@if (latency is null)
{
    <span>Calculating...</span>
}
else
{
    <span>@(latency.Value.TotalMilliseconds)ms</span>
}

@code
{
    private DateTime startTime;
    private TimeSpan? latency;

    protected override async Task OnInitializedAsync()
    {
        startTime = DateTime.UtcNow;
        var _ = await JS.InvokeAsync<string>("toString");
        latency = DateTime.UtcNow - startTime;
    }
}

Per un'esperienza dell'interfaccia utente ragionevole, è consigliabile una latenza di interfaccia utente prolungata di 250ms o meno.For a reasonable UI experience, we recommend a sustained UI latency of 250ms or less.