Implementazione del server Web HTTP.sys in ASP.NET CoreHTTP.sys web server implementation in ASP.NET Core

Di Tom Dykstra, Chris Ross e Luke LathamBy Tom Dykstra, Chris Ross, and Luke Latham

HTTP.sys è un server Web per ASP.NET Core che può essere eseguito solo in Windows.HTTP.sys is a web server for ASP.NET Core that only runs on Windows. HTTP.sys è un'alternativa al server Kestrel e offre alcune funzionalità non presenti in Kestrel.HTTP.sys is an alternative to Kestrel server and offers some features that Kestrel doesn't provide.

Importante

HTTP.sys non è compatibile con il modulo ASP.NET Core e non può essere usato con IIS o IIS Express.HTTP.sys isn't compatible with the ASP.NET Core Module and can't be used with IIS or IIS Express.

HTTP.sys supporta le funzionalità seguenti:HTTP.sys supports the following features:

  • Autenticazione di WindowsWindows Authentication
  • Condivisione delle portePort sharing
  • HTTPS con SNIHTTPS with SNI
  • HTTP/2 su TLS (Windows 10 o versioni successive)HTTP/2 over TLS (Windows 10 or later)
  • Trasmissione diretta dei fileDirect file transmission
  • Memorizzazione nella cache delle risposteResponse caching
  • WebSockets (Windows 8 o versioni successive)WebSockets (Windows 8 or later)

Versioni di Windows supportate:Supported Windows versions:

  • Windows 7 o versione successivaWindows 7 or later
  • Windows Server 2008 R2 o versioni successiveWindows Server 2008 R2 or later

Visualizzare o scaricare il codice di esempio (procedura per il download)View or download sample code (how to download)

Quando usare HTTP.sysWhen to use HTTP.sys

HTTP.sys è utile per le distribuzioni nei casi seguenti:HTTP.sys is useful for deployments where:

  • È necessario esporre il server direttamente a Internet senza usare IIS.There's a need to expose the server directly to the Internet without using IIS.

    HTTP.sys comunica direttamente con Internet

  • Una distribuzione interna richiede una funzionalità non disponibile in Kestrel, ad esempio l'autenticazione di Windows.An internal deployment requires a feature not available in Kestrel, such as Windows Authentication.

    HTTP.sys comunica direttamente con la rete interna

HTTP.sys è una tecnologia consolidata che protegge da molti tipi di attacchi e offre l'affidabilità, la sicurezza e la scalabilità di un server Web con funzionalità complete.HTTP.sys is mature technology that protects against many types of attacks and provides the robustness, security, and scalability of a full-featured web server. IIS viene eseguito come listener HTTP in HTTP.sys.IIS itself runs as an HTTP listener on top of HTTP.sys.

Supporto per HTTP/2HTTP/2 support

HTTP/2 è abilitato per le app ASP.NET Core se vengono soddisfatti i requisiti di base seguenti:HTTP/2 is enabled for ASP.NET Core apps if the following base requirements are met:

Se viene stabilita una connessione HTTP/2, HttpRequest.Protocol corrisponde a HTTP/2.If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/2.

Se viene stabilita una connessione HTTP/2, HttpRequest.Protocol corrisponde a HTTP/1.1.If an HTTP/2 connection is established, HttpRequest.Protocol reports HTTP/1.1.

HTTP/2 è abilitato per impostazione predefinita.HTTP/2 is enabled by default. Se non viene stabilita una connessione HTTP/2, la connessione esegue il fallback a HTTP/1.1.If an HTTP/2 connection isn't established, the connection falls back to HTTP/1.1. In una versione futura di Windows sarà disponibile il flag di configurazione di HTTP/2 e sarà possibile disabilitare il protocollo HTTP/2 con HTTP.sys.In a future release of Windows, HTTP/2 configuration flags will be available, including the ability to disable HTTP/2 with HTTP.sys.

Autenticazione in modalità kernel con KerberosKernel mode authentication with Kerberos

Per la delega all'autenticazione in modalità kernel, HTTP.sys usa il protocollo di autenticazione Kerberos.HTTP.sys delegates to kernel mode authentication with the Kerberos authentication protocol. L'autenticazione in modalità utente non è supportata con Kerberos e HTTP.sys.User mode authentication isn't supported with Kerberos and HTTP.sys. È necessario usare l'account del computer per decrittografare il token/ticket Kerberos ottenuto da Active Directory e inoltrato dal client al server per autenticare l'utente.The machine account must be used to decrypt the Kerberos token/ticket that's obtained from Active Directory and forwarded by the client to the server to authenticate the user. Registrare il nome dell'entità servizio per l'host, non l'utente dell'app.Register the Service Principal Name (SPN) for the host, not the user of the app.

Come usare HTTP.sysHow to use HTTP.sys

Configurare l'app ASP.NET Core per l'uso di HTTP.sysConfigure the ASP.NET Core app to use HTTP.sys

Non è necessario un riferimento al pacchetto nel file di progetto quando si usa il metapacchetto Microsoft. AspNetCore. app (NuGet.org).A package reference in the project file isn't required when using the Microsoft.AspNetCore.App metapackage (nuget.org). Se non si usa il metapacchetto Microsoft.AspNetCore.App aggiungere un riferimento al pacchetto a Microsoft.AspNetCore.Server.HttpSys.When not using the Microsoft.AspNetCore.App metapackage, add a package reference to Microsoft.AspNetCore.Server.HttpSys.

Chiamare il metodo di estensione UseHttpSys quando si compila l'host, specificando le eventuali HttpSysOptions necessarie.Call the UseHttpSys extension method when building the host, specifying any required HttpSysOptions. L'esempio seguente imposta le opzioni sui rispettivi valori predefiniti:The following example sets options to their default values:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseHttpSys(options =>
            {
                options.AllowSynchronousIO = true;
                options.Authentication.Schemes = AuthenticationSchemes.None;
                options.Authentication.AllowAnonymous = true;
                options.MaxConnections = null;
                options.MaxRequestBodySize = 30000000;
                options.UrlPrefixes.Add("http://localhost:5005");
            });
            webBuilder.UseStartup<Startup>();
        });
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            options.AllowSynchronousIO = true;
            options.Authentication.Schemes = AuthenticationSchemes.None;
            options.Authentication.AllowAnonymous = true;
            options.MaxConnections = null;
            options.MaxRequestBodySize = 30000000;
            options.UrlPrefixes.Add("http://localhost:5000");
        });

Le configurazioni aggiuntive di HTTP.sys vengono gestite tramite impostazioni del Registro di sistema.Additional HTTP.sys configuration is handled through registry settings.

Opzioni di HTTP.sysHTTP.sys options

ProprietàProperty DescrizioneDescription PredefinitoDefault
AllowSynchronousIOAllowSynchronousIO Controllare se l'input e/o l'output sincroni sono consentiti per HttpContext.Request.Body e HttpContext.Response.Body.Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. false
Authentication.AllowAnonymousAuthentication.AllowAnonymous Consentire richieste anonime.Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes Specificare gli schemi di autenticazione consentiti.Specify the allowed authentication schemes. Può essere modificata in qualsiasi momento prima dell'eliminazione del listener.May be modified at any time prior to disposing the listener. I valori sono forniti dall'enumerazione AuthenticationSchemes: Basic, Kerberos, Negotiate, None e NTLM.Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching Tentare la memorizzazione nella cache in modalità kernel per le risposte con intestazioni idonee.Attempt kernel-mode caching for responses with eligible headers. La risposta potrebbe non includere intestazioni Set-Cookie, Vary o Pragma.The response may not include Set-Cookie, Vary, or Pragma headers. Deve includere un'intestazione Cache-Control public con valore shared-max-age o max-age o un'intestazione Expires.It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. true
MaxAccepts Numero massimo di accettazioni simultanee.The maximum number of concurrent accepts. 5 × Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections Numero massimo di connessioni simultanee da accettare.The maximum number of concurrent connections to accept. Usare -1 per un numero infinito.Use -1 for infinite. Usare null per usare l'impostazione a livello di computer del Registro di sistema.Use null to use the registry's machine-wide setting. null
(illimitato)(unlimited)
MaxRequestBodySize Vedere la sezione MaxRequestBodySize.See the MaxRequestBodySize section. 30000000 byte30000000 bytes
(~28,6 MB)(~28.6 MB)
RequestQueueLimit Numero massimo di richieste che è possibile accodare.The maximum number of requests that can be queued. 10001000
ThrowWriteExceptions Indica se le scritture del corpo della risposta che hanno esito negativo a causa di disconnessioni del client devono generare eccezioni o vengono completate normalmente.Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(completamento normale)(complete normally)
Timeouts Espone la configurazione di TimeoutManager HTTP.sys, che può essere configurata anche nel Registro di sistema.Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Seguire i collegamenti API per altre informazioni su ogni impostazione, inclusi i valori predefiniti:Follow the API links to learn more about each setting, including default values:
UrlPrefixes Specificare l'elemento UrlPrefixCollection da registrare con HTTP.sys.Specify the UrlPrefixCollection to register with HTTP.sys. Il più utile è il metodo UrlPrefixCollection.Add usato per aggiungere un prefisso alla raccolta.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Queste impostazioni possono essere modificate in qualsiasi momento prima dell'eliminazione del listener.These may be modified at any time prior to disposing the listener.
ProprietàProperty DescrizioneDescription PredefinitoDefault
AllowSynchronousIOAllowSynchronousIO Controllare se l'input e/o l'output sincroni sono consentiti per HttpContext.Request.Body e HttpContext.Response.Body.Control whether synchronous input/output is allowed for the HttpContext.Request.Body and HttpContext.Response.Body. true
Authentication.AllowAnonymousAuthentication.AllowAnonymous Consentire richieste anonime.Allow anonymous requests. true
Authentication.SchemesAuthentication.Schemes Specificare gli schemi di autenticazione consentiti.Specify the allowed authentication schemes. Può essere modificata in qualsiasi momento prima dell'eliminazione del listener.May be modified at any time prior to disposing the listener. I valori sono forniti dall'enumerazione AuthenticationSchemes: Basic, Kerberos, Negotiate, None e NTLM.Values are provided by the AuthenticationSchemes enum: Basic, Kerberos, Negotiate, None, and NTLM. None
EnableResponseCachingEnableResponseCaching Tentare la memorizzazione nella cache in modalità kernel per le risposte con intestazioni idonee.Attempt kernel-mode caching for responses with eligible headers. La risposta potrebbe non includere intestazioni Set-Cookie, Vary o Pragma.The response may not include Set-Cookie, Vary, or Pragma headers. Deve includere un'intestazione Cache-Control public con valore shared-max-age o max-age o un'intestazione Expires.It must include a Cache-Control header that's public and either a shared-max-age or max-age value, or an Expires header. true
MaxAccepts Numero massimo di accettazioni simultanee.The maximum number of concurrent accepts. 5 × Environment.
ProcessorCount
5 × Environment.
ProcessorCount
MaxConnections Numero massimo di connessioni simultanee da accettare.The maximum number of concurrent connections to accept. Usare -1 per un numero infinito.Use -1 for infinite. Usare null per usare l'impostazione a livello di computer del Registro di sistema.Use null to use the registry's machine-wide setting. null
(illimitato)(unlimited)
MaxRequestBodySize Vedere la sezione MaxRequestBodySize.See the MaxRequestBodySize section. 30000000 byte30000000 bytes
(~28,6 MB)(~28.6 MB)
RequestQueueLimit Numero massimo di richieste che è possibile accodare.The maximum number of requests that can be queued. 10001000
ThrowWriteExceptions Indica se le scritture del corpo della risposta che hanno esito negativo a causa di disconnessioni del client devono generare eccezioni o vengono completate normalmente.Indicate if response body writes that fail due to client disconnects should throw exceptions or complete normally. false
(completamento normale)(complete normally)
Timeouts Espone la configurazione di TimeoutManager HTTP.sys, che può essere configurata anche nel Registro di sistema.Expose the HTTP.sys TimeoutManager configuration, which may also be configured in the registry. Seguire i collegamenti API per altre informazioni su ogni impostazione, inclusi i valori predefiniti:Follow the API links to learn more about each setting, including default values:
UrlPrefixes Specificare l'elemento UrlPrefixCollection da registrare con HTTP.sys.Specify the UrlPrefixCollection to register with HTTP.sys. Il più utile è il metodo UrlPrefixCollection.Add usato per aggiungere un prefisso alla raccolta.The most useful is UrlPrefixCollection.Add, which is used to add a prefix to the collection. Queste impostazioni possono essere modificate in qualsiasi momento prima dell'eliminazione del listener.These may be modified at any time prior to disposing the listener.

MaxRequestBodySizeMaxRequestBodySize

Dimensioni massime consentite per qualsiasi corpo della richiesta in byte.The maximum allowed size of any request body in bytes. Con l'impostazione null, le dimensioni massime del corpo della richiesta sono illimitate.When set to null, the maximum request body size is unlimited. Questo limite non ha effetto sulle connessioni aggiornate, che sono sempre illimitate.This limit has no effect on upgraded connections, which are always unlimited.

Il metodo consigliato per ignorare il limite in un'applicazione ASP.NET Core MVC per un singolo IActionResult prevede l'uso dell'attributo RequestSizeLimitAttribute in un metodo di azione:The recommended method to override the limit in an ASP.NET Core MVC app for a single IActionResult is to use the RequestSizeLimitAttribute attribute on an action method:

[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()

Se l'app tenta di configurare il limite per una richiesta dopo che l'app ha avviato la lettura della richiesta stessa, viene generata un'eccezione.An exception is thrown if the app attempts to configure the limit on a request after the app has started reading the request. È possibile usare una proprietà IsReadOnly per indicare se la proprietà MaxRequestBodySize è in stato di sola lettura e pertanto è troppo tardi per configurare il limite.An IsReadOnly property can be used to indicate if the MaxRequestBodySize property is in a read-only state, meaning it's too late to configure the limit.

Se l'app deve eseguire l'override di MaxRequestBodySize per ogni richiesta, usare IHttpMaxRequestBodySizeFeature:If the app should override MaxRequestBodySize per-request, use the IHttpMaxRequestBodySizeFeature:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, 
    ILogger<Startup> logger, IServer server)
{
    app.Use(async (context, next) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        var serverAddressesFeature = 
            app.ServerFeatures.Get<IServerAddressesFeature>();
        var addresses = string.Join(", ", serverAddressesFeature?.Addresses);

        logger.LogInformation($"Addresses: {addresses}");

        await next.Invoke();
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    ILogger<Startup> logger, IServer server)
{
    app.Use(async (context, next) =>
    {
        context.Features.Get<IHttpMaxRequestBodySizeFeature>()
            .MaxRequestBodySize = 10 * 1024;

        var serverAddressesFeature = 
            app.ServerFeatures.Get<IServerAddressesFeature>();
        var addresses = string.Join(", ", serverAddressesFeature?.Addresses);

        logger.LogInformation($"Addresses: {addresses}");

        await next.Invoke();
    });

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }

    // Enable HTTPS Redirection Middleware when hosting the app securely.
    //app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseCookiePolicy();
    app.UseMvc();
}

Se si usa Visual Studio, assicurarsi che l'app non sia configurata per l'esecuzione di IIS o IIS Express.If using Visual Studio, make sure the app isn't configured to run IIS or IIS Express.

In Visual Studio il profilo di avvio predefinito è per IIS Express.In Visual Studio, the default launch profile is for IIS Express. Per eseguire il progetto come app console, modificare manualmente il profilo selezionato, come illustrato nello screenshot seguente:To run the project as a console app, manually change the selected profile, as shown in the following screen shot:

Selezionare il profilo dell'applicazione console

Configurare Windows ServerConfigure Windows Server

  1. Determinare le porte da aprire per l'app e usare Windows Firewall o il cmdlet di PowerShell New-NetFirewallRule per aprire le porte del firewall per consentire al traffico di raggiungere HTTP.sys.Determine the ports to open for the app and use Windows Firewall or the New-NetFirewallRule PowerShell cmdlet to open firewall ports to allow traffic to reach HTTP.sys. Nei comandi seguenti e nella configurazione dell'app, viene usata la porta 443.In the following commands and app configuration, port 443 is used.

  2. Quando si distribuisce una macchina virtuale di Azure, aprire le porte nel gruppo di sicurezza di rete.When deploying to an Azure VM, open the ports in the Network Security Group. Nei comandi seguenti e nella configurazione dell'app, viene usata la porta 443.In the following commands and app configuration, port 443 is used.

  3. Ottenere e installare i certificati X.509, se necessario.Obtain and install X.509 certificates, if required.

    In Windows, creare certificati autofirmati con il cmdlet di PowerShell New-SelfSignedCertificate.On Windows, create self-signed certificates using the New-SelfSignedCertificate PowerShell cmdlet. Per un esempio non supportato, vedere UpdateIISExpressSSLForChrome.ps1.For an unsupported example, see UpdateIISExpressSSLForChrome.ps1.

    Installare i certificati autofirmati o con firma nell'archivio Computer locale > Personale del server.Install either self-signed or CA-signed certificates in the server's Local Machine > Personal store.

  4. Se l'app è una distribuzione dipendente dal framework, installare .NET Core, .NET Framework o entrambi (se l'app è un'app .NET Core destinata a .NET Framework).If the app is a framework-dependent deployment, install .NET Core, .NET Framework, or both (if the app is a .NET Core app targeting the .NET Framework).

    • .NET Core – Se l'app richiede .NET Core, ottenere ed eseguire il programma di installazione di .NET Core Runtime dalla pagina di download per .NET Core..NET Core – If the app requires .NET Core, obtain and run the .NET Core Runtime installer from .NET Core Downloads. Non installare l'SDK completo nel server.Don't install the full SDK on the server.
    • .NET Framework – Se l'app richiede .NET Framework, vedere la guida all'installazione di .NET Framework..NET Framework – If the app requires .NET Framework, see the .NET Framework installation guide. Installare la versione di .NET Framework richiesta.Install the required .NET Framework. Il programma di installazione per la versione più recente di .NET Framework è disponibile dalla pagina di download per .NET Core.The installer for the latest .NET Framework is available from the .NET Core Downloads page.

    Se l'app è una distribuzione autonoma include il runtime nella distribuzione.If the app is a self-contained deployment, the app includes the runtime in its deployment. Non è richiesta l'installazione di un framework nel server.No framework installation is required on the server.

  5. Configurare gli URL e le porte nell'app.Configure URLs and ports in the app.

    Per impostazione predefinita, ASP.NET Core è associato a http://localhost:5000.By default, ASP.NET Core binds to http://localhost:5000. Per configurare le porte e i prefissi URL, è possibile usare:To configure URL prefixes and ports, options include:

    • UseUrls
    • L'argomento della riga di comando urlsurls command-line argument
    • La variabile di ambiente ASPNETCORE_URLSASPNETCORE_URLS environment variable
    • UrlPrefixes

    L'esempio di codice seguente mostra come usare UrlPrefixes con l'indirizzo IP locale del server 10.0.0.4 sulla porta 443:The following code example shows how to use UrlPrefixes with the server's local IP address 10.0.0.4 on port 443:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseHttpSys(options =>
            {
                options.UrlPrefixes.Add("https://10.0.0.4:443");
            });
            webBuilder.UseStartup<Startup>();
        });
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseHttpSys(options =>
        {
            options.UrlPrefixes.Add("https://10.0.0.4:443");
        });

Un vantaggio offerto da UrlPrefixes è che viene generato immediatamente un messaggio di errore per i prefissi non formattati correttamente.An advantage of UrlPrefixes is that an error message is generated immediately for improperly formatted prefixes.

Le impostazioni di UrlPrefixes sostituiscono le impostazioni UseUrls/urls/ASPNETCORE_URLS.The settings in UrlPrefixes override UseUrls/urls/ASPNETCORE_URLS settings. Pertanto, un vantaggio offerto da UseUrls, urls e dalla variabile di ambiente ASPNETCORE_URLS è che risulta più semplice alternare Kestrel e HTTP.sys.Therefore, an advantage of UseUrls, urls, and the ASPNETCORE_URLS environment variable is that it's easier to switch between Kestrel and HTTP.sys.

HTTP.sys usa i formati di stringa UrlPrefix dell'API del server HTTP.HTTP.sys uses the HTTP Server API UrlPrefix string formats.

Avviso

Le associazioni con caratteri jolly di livello superiore (http://*:80/ e http://+:80) non devono essere usate,Top-level wildcard bindings (http://*:80/ and http://+:80) should not be used. poiché possono creare vulnerabilità a livello di sicurezza nell'app.Top-level wildcard bindings create app security vulnerabilities. Questo concetto vale sia per i caratteri jolly sicuri che vulnerabili.This applies to both strong and weak wildcards. Usare nomi host o indirizzi IP espliciti al posto di caratteri jolly.Use explicit host names or IP addresses rather than wildcards. L'associazione con caratteri jolly del sottodominio (ad esempio, *.mysub.com) non costituisce un rischio per la sicurezza se viene controllato l'intero dominio padre (a differenza di *.com, che è vulnerabile).Subdomain wildcard binding (for example, *.mysub.com) isn't a security risk if you control the entire parent domain (as opposed to *.com, which is vulnerable). Per altre informazioni, vedere RFC 7230: sezione 5.4: Host.For more information, see RFC 7230: Section 5.4: Host.

  1. Pre-registrare i prefissi URL nel server.Preregister URL prefixes on the server.

    Lo strumento predefinito per la configurazione di HTTP.sys è netsh.exe.The built-in tool for configuring HTTP.sys is netsh.exe. Netsh.exe viene usato per riservare i prefissi URL e assegnare i certificati X.509.netsh.exe is used to reserve URL prefixes and assign X.509 certificates. Per questo strumento sono necessari privilegi di amministratore.The tool requires administrator privileges.

    Usare lo strumento netsh.exe per registrare gli URL per l'app:Use the netsh.exe tool to register URLs for the app:

    netsh http add urlacl url=<URL> user=<USER>
    
    • <URL> – L'URL (Uniform Resource Locator) completo.<URL> – The fully qualified Uniform Resource Locator (URL). Non usare un'associazione con caratteri jolly.Don't use a wildcard binding. Usare un nome host valido o un indirizzo IP locale.Use a valid hostname or local IP address. L'URL deve includere una barra finale.The URL must include a trailing slash.
    • <USER> – Specifica il nome dell'utente o del gruppo di utenti.<USER> – Specifies the user or user-group name.

    Nell'esempio seguente, l'indirizzo IP locale del server è 10.0.0.4:In the following example, the local IP address of the server is 10.0.0.4:

    netsh http add urlacl url=https://10.0.0.4:443/ user=Users
    

    Quando viene registrato un URL, lo strumento risponde con URL reservation successfully added.When a URL is registered, the tool responds with URL reservation successfully added.

    Per eliminare un URL registrato, usare il comando delete urlacl:To delete a registered URL, use the delete urlacl command:

    netsh http delete urlacl url=<URL>
    
  2. Registrare i certificati X.509 nel server.Register X.509 certificates on the server.

    Usare lo strumento netsh.exe per registrare i certificati per l'app:Use the netsh.exe tool to register certificates for the app:

    netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
    
    • <IP> – Specifica l'indirizzo IP locale per l'associazione.<IP> – Specifies the local IP address for the binding. Non usare un'associazione con caratteri jolly.Don't use a wildcard binding. Usare un indirizzo IP valido.Use a valid IP address.
    • <PORT> – Specifica la porta per l'associazione.<PORT> – Specifies the port for the binding.
    • <THUMBPRINT> – Identificazione digitale del certificato X.509.<THUMBPRINT> – The X.509 certificate thumbprint.
    • <GUID> – Un GUID generato per gli sviluppatori per rappresentare l'app a scopo informativo.<GUID> – A developer-generated GUID to represent the app for informational purposes.

    A scopo di riferimento, archiviare il GUID nell'app come tag di pacchetto:For reference purposes, store the GUID in the app as a package tag:

    • In Visual Studio:In Visual Studio:
      • Aprire le proprietà del progetto dell'app facendo clic sull'app con il pulsante destro del mouse in Esplora soluzioni e scegliendo Proprietà.Open the app's project properties by right-clicking on the app in Solution Explorer and selecting Properties.
      • Selezionare la scheda Pacchetto.Select the Package tab.
      • Immettere il GUID creato nel campo Tag.Enter the GUID that you created in the Tags field.
    • Se non si usa Visual Studio:When not using Visual Studio:
      • Aprire il file di progetto dell'app.Open the app's project file.

      • Aggiungere una proprietà <PackageTags> a un <PropertyGroup> nuovo o esistente con il GUID creato:Add a <PackageTags> property to a new or existing <PropertyGroup> with the GUID that you created:

        <PropertyGroup>
          <PackageTags>9412ee86-c21b-4eb8-bd89-f650fbf44931</PackageTags>
        </PropertyGroup>
        

    Nell'esempio seguente:In the following example:

    • L'indirizzo IP locale del server è 10.0.0.4.The local IP address of the server is 10.0.0.4.
    • Un generatore di GUID casuali online fornisce il valore appid.An online random GUID generator provides the appid value.
    netsh http add sslcert 
        ipport=10.0.0.4:443 
        certhash=b66ee04419d4ee37464ab8785ff02449980eae10 
        appid="{9412ee86-c21b-4eb8-bd89-f650fbf44931}"
    

    Quando viene registrato un certificato, lo strumento risponde con SSL Certificate successfully added.When a certificate is registered, the tool responds with SSL Certificate successfully added.

    Per eliminare la registrazione di un certificato, usare il comando delete sslcert:To delete a certificate registration, use the delete sslcert command:

    netsh http delete sslcert ipport=<IP>:<PORT>
    

    Documentazione di riferimento per netsh.exe:Reference documentation for netsh.exe:

  3. Eseguire l'app.Run the app.

    Non sono necessari i privilegi di amministratore per eseguire l'app con binding a localhost tramite HTTP (non HTTPS) con un numero di porta maggiore di 1024.Administrator privileges aren't required to run the app when binding to localhost using HTTP (not HTTPS) with a port number greater than 1024. Per altre configurazioni (ad esempio, l'uso di un indirizzo IP locale o il binding sulla porta 443), eseguire l'app con i privilegi di amministratore.For other configurations (for example, using a local IP address or binding to port 443), run the app with administrator privileges.

    L'app risponde all'indirizzo IP pubblico del server.The app responds at the server's public IP address. In questo esempio, il server è raggiungibile da Internet al relativo indirizzo IP pubblico 104.214.79.47.In this example, the server is reached from the Internet at its public IP address of 104.214.79.47.

    In questo esempio viene usato un certificato di sviluppo.A development certificate is used in this example. La pagina viene caricata in modo sicuro dopo aver ignorato l'avviso di certificato non attendibile del browser.The page loads securely after bypassing the browser's untrusted certificate warning.

    Finestra del browser che mostra la pagina di indice dell'app caricata

Scenari con server proxy e servizi di bilanciamento del caricoProxy server and load balancer scenarios

Per le app ospitate da HTTP.sys che interagiscono con richieste da Internet o da una rete aziendale, potrebbero essere necessari interventi di configurazione aggiuntivi in caso di hosting dietro server proxy e servizi di bilanciamento del carico.For apps hosted by HTTP.sys that interact with requests from the Internet or a corporate network, additional configuration might be required when hosting behind proxy servers and load balancers. Per altre informazioni, vedere Configurare ASP.NET Core per l'utilizzo di server proxy e servizi di bilanciamento del carico.For more information, see Configure ASP.NET Core to work with proxy servers and load balancers.

Risorse aggiuntiveAdditional resources