Ospitare ASP.NET Core in un servizio WindowsHost ASP.NET Core in a Windows Service

È possibile ospitare un'app ASP.NET Core in Windows come servizio Windows senza usare IIS.An ASP.NET Core app can be hosted on Windows as a Windows Service without using IIS. Quando è ospitata come servizio di Windows, l'app viene avviata automaticamente dopo il riavvio del server.When hosted as a Windows Service, the app automatically starts after server reboots.

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

PrerequisitesPrerequisites

Modello di servizio di ruolo di lavoroWorker Service template

Il modello di servizio di ruolo di lavoro di ASP.NET Core rappresenta un punto di partenza per la scrittura di app di servizi a esecuzione prolungata.The ASP.NET Core Worker Service template provides a starting point for writing long running service apps. Per usare il modello come base per un'app di servizio Windows:To use the template as a basis for a Windows Service app:

  1. Creare un'app di servizio di ruolo di lavoro dal modello .NET Core.Create a Worker Service app from the .NET Core template.
  2. Seguire le indicazioni nella sezione Configurazione dell'app per aggiornare l'app di servizio di ruolo di lavoro affinché venga eseguita come servizio Windows.Follow the guidance in the App configuration section to update the Worker Service app so that it can run as a Windows Service.
  1. Creare un nuovo progetto.Create a new project.
  2. Selezionare il servizio Worker.Select Worker Service. Selezionare Avanti.Select Next.
  3. Specificare il nome di un progetto nel campo Nome progetto oppure accettare il nome predefinito.Provide a project name in the Project name field or accept the default project name. Selezionare Create (Crea).Select Create.
  4. Nella finestra di dialogo Crea un nuovo servizio del ruolo di lavoro selezionare Crea.In the Create a new Worker service dialog, select Create.

Configurazione dell'appApp configuration

L'app richiede un riferimento al pacchetto per Microsoft. Extensions. Hosting. WindowsServices.The app requires a package reference for Microsoft.Extensions.Hosting.WindowsServices.

IHostBuilder.UseWindowsService viene chiamato durante la compilazione dell'host.IHostBuilder.UseWindowsService is called when building the host. Se l'app è in esecuzione come servizio di Windows, il metodo:If the app is running as a Windows Service, the method:

  • Imposta la durata dell'host su WindowsServiceLifetime.Sets the host lifetime to WindowsServiceLifetime.
  • Imposta la radice del contenuto su AppContext. BaseDirectory.Sets the content root to AppContext.BaseDirectory. Per altre informazioni, vedere la sezione Directory corrente e radice del contenuto.For more information, see the Current directory and content root section.
  • Abilita la registrazione nel registro eventi:Enables logging to the event log:
    • Il nome dell'applicazione viene usato come nome di origine predefinito.The application name is used as the default source name.
    • Il livello di registrazione predefinito è avviso o superiore per un'app basata su un modello di ASP.NET Core che chiama CreateDefaultBuilder per compilare l'host.The default log level is Warning or higher for an app based on an ASP.NET Core template that calls CreateDefaultBuilder to build the host.
    • Eseguire l'override del livello di registrazione predefinito con la chiave Logging:EventLog:LogLevel:Default in appSettings. json/appSettings. { Environment}. JSON o un altro provider di configurazione.Override the default log level with the Logging:EventLog:LogLevel:Default key in appsettings.json/appsettings.{Environment}.json or other configuration provider.
    • Solo gli amministratori possono creare nuove origini eventi.Only administrators can create new event sources. Quando non è possibile creare un'origine evento usando il nome dell'applicazione, viene registrato un avviso nell'origine Applicazione e i log eventi vengono disabilitati.When an event source can't be created using the application name, a warning is logged to the Application source and event logs are disabled.

In CreateHostBuilder di Program.cs:In CreateHostBuilder of Program.cs:

Host.CreateDefaultBuilder(args)
    .UseWindowsService()
    ...

Questo argomento è accompagnato dalle app di esempio seguenti:The following sample apps accompany this topic:

  • Esempio di servizio di lavoro in background – un esempio di app non Web basato sul modello di servizio del ruolo di lavoro che usa i servizi ospitati per le attività in background.Background Worker Service Sample – A non-web app sample based on the Worker Service template that uses hosted services for background tasks.
  • Esempio di servizio app Web – un esempio di app Web Razor Pages che viene eseguito come servizio Windows con servizi ospitati per le attività in background.Web App Service Sample – A Razor Pages web app sample that runs as a Windows Service with hosted services for background tasks.

Per informazioni aggiuntive su MVC, vedere gli articoli in Panoramica di ASP.NET MVC e Eseguire la migrazione da ASP.NET Core 2,2 a 3,0.For MVC guidance, see the articles under Panoramica di ASP.NET MVC and Eseguire la migrazione da ASP.NET Core 2,2 a 3,0.

Tipo di distribuzioneDeployment type

Per informazioni e consigli sugli scenari di distribuzione, vedere Distribuzione di applicazioni .NET Core.For information and advice on deployment scenarios, see .NET Core application deployment.

SDKSDK

Per un servizio basato su app Web che usa i Framework Razor Pages o MVC, specificare Web SDK nel file di progetto:For a web app-based service that uses the Razor Pages or MVC frameworks, specify the Web SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Web">

Se il servizio esegue solo attività in background, ad esempio servizi ospitati, specificare l'SDK del ruolo di lavoro nel file di progetto:If the service only executes background tasks (for example, hosted services), specify the Worker SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Distribuzione dipendente dal frameworkFramework-dependent deployment (FDD)

La distribuzione dipendente dal framework si basa sulla presenza di una versione condivisa a livello di sistema di .NET Core nel sistema di destinazione.Framework-dependent deployment (FDD) relies on the presence of a shared system-wide version of .NET Core on the target system. Quando lo scenario di distribuzione dipendente dal framework viene implementato in base alle indicazioni di questo articolo, l'SDK genera un file eseguibile (con estensione exe) detto eseguibile dipendente dal framework.When the FDD scenario is adopted following the guidance in this article, the SDK produces an executable (.exe), called a framework-dependent executable.

Se si usa l' SDK Web, un file Web. config , che in genere viene generato quando si pubblica un'app ASP.NET Core, non è necessario per un'app dei servizi Windows.If using the Web SDK, a web.config file, which is normally produced when publishing an ASP.NET Core app, is unnecessary for a Windows Services app. Per disabilitare la creazione del file web.config, aggiungere la proprietà <IsTransformWebConfigDisabled> impostata su true.To disable the creation of the web.config file, add the <IsTransformWebConfigDisabled> property set to true.

<PropertyGroup>
  <TargetFramework>netcoreapp3.0</TargetFramework>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Distribuzione autonomaSelf-contained deployment (SCD)

Una distribuzione autonoma non si basa sulla presenza di un framework condiviso nel sistema host.Self-contained deployment (SCD) doesn't rely on the presence of a shared framework on the host system. Il runtime e le dipendenze dell'app vengono distribuiti con l'app.The runtime and the app's dependencies are deployed with the app.

Un identificatore di runtime (RID) di Windows viene incluso nel <PropertyGroup> che contiene il framework di destinazione:A Windows Runtime Identifier (RID) is included in the <PropertyGroup> that contains the target framework:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Per eseguire la pubblicazione per più identificatori di runtime:To publish for multiple RIDs:

  • Specificare gli identificatori di runtime in un elenco delimitato da punto e virgola.Provide the RIDs in a semicolon-delimited list.
  • Usare il nome di proprietà <RuntimeIdentifiers> (plurale).Use the property name <RuntimeIdentifiers> (plural).

Per altre informazioni, vedere il Catalogo RID di .NET Core.For more information, see .NET Core RID Catalog.

Account utente del servizioService user account

Per creare un account utente per un servizio, usare il cmdlet New-LocalUser da una shell dei comandi di PowerShell 6 amministrativa.To create a user account for a service, use the New-LocalUser cmdlet from an administrative PowerShell 6 command shell.

In Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763) o versioni successive:On Windows 10 October 2018 Update (version 1809/build 10.0.17763) or later:

New-LocalUser -Name {SERVICE NAME}

In un sistema operativo Windows precedente ad Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763):On Windows OS earlier than the Windows 10 October 2018 Update (version 1809/build 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Fornire una password complessa quando richiesto.Provide a strong password when prompted.

Se non viene specificato il parametro -AccountExpires per il cmdlet New-LocalUser con un valore DateTime di scadenza, l'account non scade.Unless the -AccountExpires parameter is supplied to the New-LocalUser cmdlet with an expiration DateTime, the account doesn't expire.

Per altre informazioni, vedere Microsoft.PowerShell.LocalAccounts e Service User Accounts (Account utente di servizio).For more information, see Microsoft.PowerShell.LocalAccounts and Service User Accounts.

Un approccio alternativo per la gestione degli utenti quando si usa Active Directory consiste nell'usare account del servizio gestito.An alternative approach to managing users when using Active Directory is to use Managed Service Accounts. Per altre informazioni, vedere Panoramica degli account del servizio gestito del gruppo.For more information, see Group Managed Service Accounts Overview.

Diritti Accesso come servizioLog on as a service rights

Per stabilire i diritti Accesso come servizio per un account utente di servizio:To establish Log on as a service rights for a service user account:

  1. Aprire l'editor Criteri di sicurezza locali eseguendo secpol.msc.Open the Local Security Policy editor by running secpol.msc.
  2. Espandere il nodo Criteri locali e selezionare Assegnazione diritti utente.Expand the Local Policies node and select User Rights Assignment.
  3. Aprire il criterio Accesso come servizio.Open the Log on as a service policy.
  4. Selezionare Aggiungi utente o gruppo.Select Add User or Group.
  5. Specificare il nome oggetto (account utente) in uno dei modi seguenti:Provide the object name (user account) using either of the following approaches:
    1. Digitare l'account utente ({DOMAIN OR COMPUTER NAME\USER}) nel campo del nome oggetto e scegliere OK per aggiungere l'utente al criterio.Type the user account ({DOMAIN OR COMPUTER NAME\USER}) in the object name field and select OK to add the user to the policy.
    2. Fare clic su Avanzate.Select Advanced. Selezionare Trova.Select Find Now. Selezionare l'account utente dall'elenco.Select the user account from the list. Selezionare OK.Select OK. Scegliere di nuovo OK per aggiungere l'utente al criterio.Select OK again to add the user to the policy.
  6. Scegliere OK o Applica per accettare le modifiche.Select OK or Apply to accept the changes.

Creare e gestire il servizio di WindowsCreate and manage the Windows Service

Creare un servizioCreate a service

Usare i comandi di PowerShell per registrare un servizio.Use PowerShell commands to register a service. Da una shell dei comandi di PowerShell 6 amministrativa eseguire i comandi seguenti:From an administrative PowerShell 6 command shell, execute the following commands:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = {DOMAIN OR COMPUTER NAME\USER}, "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName {EXE FILE PATH} -Credential {DOMAIN OR COMPUTER NAME\USER} -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH} – percorso alla cartella dell'app nell'host, ad esempio d:\myservice.{EXE PATH} – Path to the app's folder on the host (for example, d:\myservice). Non includere l'eseguibile dell'app nel percorso.Don't include the app's executable in the path. Non è necessario aggiungere una barra finale.A trailing slash isn't required.
  • {DOMAIN OR COMPUTER NAME\USER} – account utente del servizio, ad esempio Contoso\ServiceUser.{DOMAIN OR COMPUTER NAME\USER} – Service user account (for example, Contoso\ServiceUser).
  • {SERVICE NAME} – nome del servizio (ad esempio, MyService).{SERVICE NAME} – Service name (for example, MyService).
  • {EXE FILE PATH} – percorso eseguibile dell'app, ad esempio d:\myservice\myservice.exe.{EXE FILE PATH} – The app's executable path (for example, d:\myservice\myservice.exe). Includere il nome del file eseguibile con l'estensione.Include the executable's file name with extension.
  • {DESCRIPTION} Descrizione del servizio –, ad esempio My sample service.{DESCRIPTION} – Service description (for example, My sample service).
  • {DISPLAY NAME} nome visualizzato del servizio –, ad esempio My Service.{DISPLAY NAME} – Service display name (for example, My Service).

Avviare un servizioStart a service

Per avviare un servizio, usare il comando di PowerShell 6 seguente:Start a service with the following PowerShell 6 command:

Start-Service -Name {SERVICE NAME}

L'avvio del servizio richiede alcuni secondi.The command takes a few seconds to start the service.

Determinare lo stato di un servizioDetermine a service's status

Per verificare lo stato di un servizio, usare il comando di PowerShell 6 seguente:To check the status of a service, use the following PowerShell 6 command:

Get-Service -Name {SERVICE NAME}

Lo stato viene indicato con uno dei valori seguenti:The status is reported as one of the following values:

  • Starting
  • Running
  • Stopping
  • Stopped

Arrestare un servizioStop a service

Per arrestare un servizio, usare il comando di PowerShell 6 seguente:Stop a service with the following Powershell 6 command:

Stop-Service -Name {SERVICE NAME}

Rimuovere un servizioRemove a service

Dopo il breve lasso di tempo necessario per arrestare un servizio, rimuovere il servizio con il comando di PowerShell 6 seguente:After a short delay to stop a service, remove a service with the following Powershell 6 command:

Remove-Service -Name {SERVICE NAME}

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

I servizi che interagiscono con le richieste da Internet o da una rete aziendale e si trovano dietro un proxy o un servizio di bilanciamento del carico potrebbero richiedere una configurazione aggiuntiva.Services that interact with requests from the Internet or a corporate network and are behind a proxy or load balancer might require additional configuration. Per altre informazioni, vedere Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.For more information, see Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.

Configurare gli endpointConfigure endpoints

Per impostazione predefinita, ASP.NET Core è associato a http://localhost:5000.By default, ASP.NET Core binds to http://localhost:5000. Configurare l'URL e la porta impostando la variabile di ambiente ASPNETCORE_URLS.Configure the URL and port by setting the ASPNETCORE_URLS environment variable.

Per ulteriori approcci alla configurazione di porte e URL, vedere l'articolo relativo al server pertinente:For additional URL and port configuration approaches, see the relevant server article:

Le linee guida precedenti riguardano il supporto per gli endpoint HTTPS.The preceding guidance covers support for HTTPS endpoints. Ad esempio, configurare l'app per HTTPS quando si usa l'autenticazione con un servizio Windows.For example, configure the app for HTTPS when authentication is used with a Windows Service.

Nota

L'uso del certificato di sviluppo ASP.NET Core HTTPS per proteggere un endpoint del servizio non è supportato.Use of the ASP.NET Core HTTPS development certificate to secure a service endpoint isn't supported.

Directory corrente e radice del contenutoCurrent directory and content root

La directory di lavoro corrente restituita chiamando GetCurrentDirectory per un servizio Windows è la cartella C:\WINDOWS\system32.The current working directory returned by calling GetCurrentDirectory for a Windows Service is the C:\WINDOWS\system32 folder. La cartella system32 non è un percorso appropriato per archiviare i file di un servizio, ad esempio i file di impostazioni.The system32 folder isn't a suitable location to store a service's files (for example, settings files). Usare uno degli approcci seguenti per gestire e accedere agli asset e ai file di impostazioni di un servizio.Use one of the following approaches to maintain and access a service's assets and settings files.

Usare ContentRootPath o ContentRootFileProviderUse ContentRootPath or ContentRootFileProvider

Usare IHostEnvironment.ContentRootPath o ContentRootFileProvider per individuare le risorse di un'app.Use IHostEnvironment.ContentRootPath or ContentRootFileProvider to locate an app's resources.

Quando l'app viene eseguita come servizio, UseWindowsService imposta l'ContentRootPath su AppContext. BaseDirectory.When the app runs as a service, UseWindowsService sets the ContentRootPath to AppContext.BaseDirectory.

File di impostazioni predefinite dell'app, appSettings. JSON e appSettings. { Environment}. JSON, viene caricato dalla radice del contenuto dell'app chiamando CreateDefaultBuilder durante la costruzione dell'host.The app's default settings files, appsettings.json and appsettings.{Environment}.json, are loaded from the app's content root by calling CreateDefaultBuilder during host construction.

Per gli altri file di impostazioni caricati dal codice dello sviluppatore in ConfigureAppConfiguration, non è necessario chiamare SetBasePath.For other settings files loaded by developer code in ConfigureAppConfiguration, there's no need to call SetBasePath. Nell'esempio seguente il file custom_settings. JSON esiste nella radice del contenuto dell'app e viene caricato senza impostare esplicitamente un percorso di base:In the following example, the custom_settings.json file exists in the app's content root and is loaded without explicitly setting a base path:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseWindowsService()
            .ConfigureAppConfiguration((hostingContext, config) =>
            {
                config.AddJsonFile("custom_settings.json");
            })
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

Non tentare di usare GetCurrentDirectory per ottenere un percorso di risorsa perché un'app di servizio Windows restituisce la cartella C:\Windows\system32 come directory corrente.Don't attempt to use GetCurrentDirectory to obtain a resource path because a Windows Service app returns the C:\WINDOWS\system32 folder as its current directory.

Archiviare i file di un servizio in un percorso appropriato nel discoStore a service's files in a suitable location on disk

Specificare un percorso assoluto con SetBasePath quando si usa un IConfigurationBuilder per la cartella contenente i file.Specify an absolute path with SetBasePath when using an IConfigurationBuilder to the folder containing the files.

Risolvere problemiTroubleshoot

Per risolvere i problemi relativi a un'app di servizio Windows, vedere Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.To troubleshoot a Windows Service app, see Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.

Errori comuniCommon errors

  • È in uso una versione precedente o provvisoria di PowerShell.An old or pre-release version of PowerShell is in use.
  • Il servizio registrato non usa l'output pubblicato dell'app dal comando DotNet Publish .The registered service doesn't use the app's published output from the dotnet publish command. L'output del comando DotNet Build non è supportato per la distribuzione di app.Output of the dotnet build command isn't supported for app deployment. Gli asset pubblicati si trovano in una delle cartelle seguenti, a seconda del tipo di distribuzione:Published assets are found in either of the following folders depending on the deployment type:
    • bin/Release/{Target Framework}/Publish (FDD)bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{Target Framework}/{Runtime Identifier}/Publish (SCD)bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Il servizio non è nello stato in esecuzione.The service isn't in the RUNNING state.
  • I percorsi delle risorse utilizzate dall'app, ad esempio i certificati, non sono corretti.The paths to resources that the app uses (for example, certificates) are incorrect. Il percorso di base di un servizio Windows è c:\Windows\system32.The base path of a Windows Service is c:\Windows\System32.
  • L'utente non dispone di diritti di accesso come servizio .The user doesn't have Log on as a service rights.
  • La password dell'utente è scaduta o non è stata passata correttamente durante l'esecuzione del comando New-Service PowerShell.The user's password is expired or incorrectly passed when executing the New-Service PowerShell command.
  • L'app richiede l'autenticazione ASP.NET Core ma non è configurata per le connessioni protette (HTTPS).The app requires ASP.NET Core authentication but isn't configured for secure connections (HTTPS).
  • La porta dell'URL della richiesta non è corretta o non è configurata correttamente nell'app.The request URL port is incorrect or not configured correctly in the app.

Log eventi di sistema e dell'applicazioneSystem and Application Event Logs

Accedere ai registri eventi di sistema e dell'applicazione:Access the System and Application Event Logs:

  1. Aprire il menu Start, cercare Visualizzatore eventie selezionare l'app Visualizzatore eventi .Open the Start menu, search for Event Viewer, and select the Event Viewer app.
  2. In Visualizzatore eventi aprire il nodo Registri di Windows.In Event Viewer, open the Windows Logs node.
  3. Selezionare sistema per aprire il registro eventi di sistema.Select System to open the System Event Log. Selezionare Applicazione per aprire il log eventi dell'applicazione.Select Application to open the Application Event Log.
  4. Cercare gli errori associati all'app in cui si è verificato il problema.Search for errors associated with the failing app.

Eseguire l'app da un prompt dei comandiRun the app at a command prompt

Molti errori di avvio non producono informazioni utili nei log eventi.Many startup errors don't produce useful information in the event logs. È possibile individuare la causa di alcuni errori eseguendo l'app da un prompt dei comandi nel sistema host.You can find the cause of some errors by running the app at a command prompt on the hosting system. Per registrare dettagli aggiuntivi dall'app, abbassare il livello di registrazione o eseguire l'app nell' ambiente di sviluppo.To log additional detail from the app, lower the log level or run the app in the Development environment.

Cancella cache di pacchettiClear package caches

Un'app funzionante potrebbe non riuscire immediatamente dopo l'aggiornamento del .NET Core SDK nel computer di sviluppo o la modifica delle versioni del pacchetto all'interno dell'app.A functioning app may fail immediately after upgrading either the .NET Core SDK on the development machine or changing package versions within the app. In alcuni casi i pacchetti incoerenti possono interrompere un'app quando si eseguono aggiornamenti principali.In some cases, incoherent packages may break an app when performing major upgrades. La maggior parte di questi problemi può essere risolta attenendosi alle istruzioni seguenti:Most of these issues can be fixed by following these instructions:

  1. Eliminare le cartelle bin e obj.Delete the bin and obj folders.

  2. Cancellare le cache dei pacchetti eseguendo le impostazioni locali di DotNet NuGet All--Clear da una shell dei comandi.Clear the package caches by executing dotnet nuget locals all --clear from a command shell.

    La cancellazione delle cache dei pacchetti può essere eseguita anche con lo strumento NuGet. exe ed eseguendo il comando nuget locals all -clear.Clearing package caches can also be accomplished with the nuget.exe tool and executing the command nuget locals all -clear. nuget.exe non è un'installazione inclusa con il sistema operativo desktop Windows e deve essere ottenuta separatamente dal sito Web NuGet.nuget.exe isn't a bundled install with the Windows desktop operating system and must be obtained separately from the NuGet website.

  3. Ripristinare e ricompilare il progetto.Restore and rebuild the project.

  4. Eliminare tutti i file nella cartella di distribuzione nel server prima di ridistribuire l'app.Delete all of the files in the deployment folder on the server prior to redeploying the app.

App lenta o bloccataSlow or hanging app

Un dump di arresto anomalo del sistema è uno snapshot della memoria del sistema e può contribuire a determinare la provocazione di un arresto anomalo dell'app, dell'avvio o dell'applicazione lenta.A crash dump is a snapshot of the system's memory and can help determine the cause of an app crash, startup failure, or slow app.

Arresto anomalo o eccezione di un'appApp crashes or encounters an exception

Ottenere e analizzare un dump da Segnalazione errori Windows:Obtain and analyze a dump from Windows Error Reporting (WER):

  1. Creare una cartella per i file dump di arresto anomalo del sistema in c:\dumps.Create a folder to hold crash dump files at c:\dumps.

  2. Eseguire lo script di PowerShell EnableDumps con il nome dell'eseguibile dell'applicazione:Run the EnableDumps PowerShell script with the application executable name:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Eseguire l'app nelle condizioni che causano l'arresto anomalo.Run the app under the conditions that cause the crash to occur.

  4. Dopo che si è verificato l'arresto anomalo, eseguire lo script di PowerShell DisableDumps:After the crash has occurred, run the DisableDumps PowerShell script:

    .\DisableDumps {APPLICATION EXE}
    

Dopo l'arresto anomalo di un'app e la raccolta dei dump, l'app può terminare normalmente.After an app crashes and dump collection is complete, the app is allowed to terminate normally. Lo script di PowerShell configura Segnalazione errori Windows per raccogliere fino a cinque dump per ogni app.The PowerShell script configures WER to collect up to five dumps per app.

Avviso

I dump di arresto anomalo del sistema potrebbero richiedere una grande quantità di spazio su disco (fino a diversi gigabyte ognuno).Crash dumps might take up a large amount of disk space (up to several gigabytes each).

L'app si blocca, si verifica un errore durante l'avvio o viene eseguita normalmenteApp hangs, fails during startup, or runs normally

Quando un'app si blocca (smette di rispondere ma non si arresta in modo anomalo), si verifica un errore durante l'avvio o viene eseguita normalmente, vedere file di dump in modalità utente: scegliere lo strumento migliore per selezionare uno strumento appropriato per produrre il dump.When an app hangs (stops responding but doesn't crash), fails during startup, or runs normally, see User-Mode Dump Files: Choosing the Best Tool to select an appropriate tool to produce the dump.

Analizzare il dumpAnalyze the dump

È possibile analizzare un dump usando diversi approcci.A dump can be analyzed using several approaches. Per altre informazioni, vedere Analyzing a User-Mode Dump File (Analisi di un file dump in modalità utente).For more information, see Analyzing a User-Mode Dump File.

Risorse aggiuntiveAdditional resources

È possibile ospitare un'app ASP.NET Core in Windows come servizio Windows senza usare IIS.An ASP.NET Core app can be hosted on Windows as a Windows Service without using IIS. Quando è ospitata come servizio di Windows, l'app viene avviata automaticamente dopo il riavvio del server.When hosted as a Windows Service, the app automatically starts after server reboots.

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

PrerequisitesPrerequisites

Configurazione dell'appApp configuration

L'app richiede i riferimenti ai pacchetti Microsoft.AspNetCore.Hosting.WindowsServices e Microsoft.Extensions.Logging.EventLog.The app requires package references for Microsoft.AspNetCore.Hosting.WindowsServices and Microsoft.Extensions.Logging.EventLog.

Per eseguire test e debug durante l'esecuzione all'esterno di un servizio, aggiungere il codice per determinare se l'app è in esecuzione come servizio o è un'app console.To test and debug when running outside of a service, add code to determine if the app is running as a service or a console app. Controllare se il debugger è collegato o se è presente un'opzione --console.Inspect if the debugger is attached or a --console switch is present. Se una delle due condizioni è vera (l'app non è eseguita come servizio), chiamare Run.If either condition is true (the app isn't run as a service), call Run. Se le condizioni sono false (l'app è eseguita come servizio):If the conditions are false (the app is run as a service):

Dato che il provider di configurazione della riga di comando richiede coppie nome-valore per gli argomenti della riga di comando, l'opzione --console viene rimossa dagli argomenti prima che CreateDefaultBuilder riceva gli argomenti.Because the Command-line Configuration Provider requires name-value pairs for command-line arguments, the --console switch is removed from the arguments before CreateDefaultBuilder receives the arguments.

Per scrivere nel registro eventi di Windows, aggiungere il provider EventLog a ConfigureLogging.To write to the Windows Event Log, add the EventLog provider to ConfigureLogging. Impostare il livello di registrazione con la chiave Logging:LogLevel:Default nel file appsettings.Production.json.Set the logging level with the Logging:LogLevel:Default key in the appsettings.Production.json file.

Nel seguente esempio dell'app di esempio, viene chiamato RunAsCustomService invece di RunAsService per gestire gli eventi di durata all'interno dell'app.In the following example from the sample app, RunAsCustomService is called instead of RunAsService in order to handle lifetime events within the app. Per altre informazioni, vedere la sezione Gestire gli eventi di avvio e arresto.For more information, see the Handle starting and stopping events section.

public class Program
{
    public static void Main(string[] args)
    {
        var isService = !(Debugger.IsAttached || args.Contains("--console"));
        
        if (isService)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            Directory.SetCurrentDirectory(pathToContentRoot);
        }

        var builder = CreateWebHostBuilder(
            args.Where(arg => arg != "--console").ToArray());

        var host = builder.Build();

        if (isService)
        {
            // To run the app without the CustomWebHostService change the
            // next line to host.RunAsService();
            host.RunAsCustomService();
        }
        else
        {
            host.Run();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddEventLog();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
                // Configure the app here.
            })
            .UseStartup<Startup>();
}

Tipo di distribuzioneDeployment type

Per informazioni e consigli sugli scenari di distribuzione, vedere Distribuzione di applicazioni .NET Core.For information and advice on deployment scenarios, see .NET Core application deployment.

SDKSDK

Per un servizio basato su app Web che usa i Framework Razor Pages o MVC, specificare Web SDK nel file di progetto:For a web app-based service that uses the Razor Pages or MVC frameworks, specify the Web SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Web">

Se il servizio esegue solo attività in background, ad esempio servizi ospitati, specificare l'SDK del ruolo di lavoro nel file di progetto:If the service only executes background tasks (for example, hosted services), specify the Worker SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Distribuzione dipendente dal frameworkFramework-dependent deployment (FDD)

La distribuzione dipendente dal framework si basa sulla presenza di una versione condivisa a livello di sistema di .NET Core nel sistema di destinazione.Framework-dependent deployment (FDD) relies on the presence of a shared system-wide version of .NET Core on the target system. Quando lo scenario di distribuzione dipendente dal framework viene implementato in base alle indicazioni di questo articolo, l'SDK genera un file eseguibile (con estensione exe) detto eseguibile dipendente dal framework.When the FDD scenario is adopted following the guidance in this article, the SDK produces an executable (.exe), called a framework-dependent executable.

L'identificatore di runtime (RID) di Windows (<RuntimeIdentifier>) contiene il framework di destinazione.The Windows Runtime Identifier (RID) (<RuntimeIdentifier>) contains the target framework. Nell'esempio seguente il RID è impostato su win7-x64.In the following example, the RID is set to win7-x64. La proprietà <SelfContained> è impostata su false.The <SelfContained> property is set to false. Queste proprietà indicano all'SDK di generare un file eseguibile (con estensione exe) per Windows e un'app che dipende dal framework .NET Core condiviso.These properties instruct the SDK to generate an executable (.exe) file for Windows and an app that depends on the shared .NET Core framework.

Un file web.config, che viene normalmente generato quando si pubblica un'app ASP.NET Core, non è necessario per un'app di servizi Windows.A web.config file, which is normally produced when publishing an ASP.NET Core app, is unnecessary for a Windows Services app. Per disabilitare la creazione del file web.config, aggiungere la proprietà <IsTransformWebConfigDisabled> impostata su true.To disable the creation of the web.config file, add the <IsTransformWebConfigDisabled> property set to true.

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  <SelfContained>false</SelfContained>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Distribuzione autonomaSelf-contained deployment (SCD)

Una distribuzione autonoma non si basa sulla presenza di un framework condiviso nel sistema host.Self-contained deployment (SCD) doesn't rely on the presence of a shared framework on the host system. Il runtime e le dipendenze dell'app vengono distribuiti con l'app.The runtime and the app's dependencies are deployed with the app.

Un identificatore di runtime (RID) di Windows viene incluso nel <PropertyGroup> che contiene il framework di destinazione:A Windows Runtime Identifier (RID) is included in the <PropertyGroup> that contains the target framework:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Per eseguire la pubblicazione per più identificatori di runtime:To publish for multiple RIDs:

  • Specificare gli identificatori di runtime in un elenco delimitato da punto e virgola.Provide the RIDs in a semicolon-delimited list.
  • Usare il nome di proprietà <RuntimeIdentifiers> (plurale).Use the property name <RuntimeIdentifiers> (plural).

Per altre informazioni, vedere il Catalogo RID di .NET Core.For more information, see .NET Core RID Catalog.

Una proprietà <SelfContained> è impostata su true:A <SelfContained> property is set to true:

<SelfContained>true</SelfContained>

Account utente del servizioService user account

Per creare un account utente per un servizio, usare il cmdlet New-LocalUser da una shell dei comandi di PowerShell 6 amministrativa.To create a user account for a service, use the New-LocalUser cmdlet from an administrative PowerShell 6 command shell.

In Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763) o versioni successive:On Windows 10 October 2018 Update (version 1809/build 10.0.17763) or later:

New-LocalUser -Name {SERVICE NAME}

In un sistema operativo Windows precedente ad Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763):On Windows OS earlier than the Windows 10 October 2018 Update (version 1809/build 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Fornire una password complessa quando richiesto.Provide a strong password when prompted.

Se non viene specificato il parametro -AccountExpires per il cmdlet New-LocalUser con un valore DateTime di scadenza, l'account non scade.Unless the -AccountExpires parameter is supplied to the New-LocalUser cmdlet with an expiration DateTime, the account doesn't expire.

Per altre informazioni, vedere Microsoft.PowerShell.LocalAccounts e Service User Accounts (Account utente di servizio).For more information, see Microsoft.PowerShell.LocalAccounts and Service User Accounts.

Un approccio alternativo per la gestione degli utenti quando si usa Active Directory consiste nell'usare account del servizio gestito.An alternative approach to managing users when using Active Directory is to use Managed Service Accounts. Per altre informazioni, vedere Panoramica degli account del servizio gestito del gruppo.For more information, see Group Managed Service Accounts Overview.

Diritti Accesso come servizioLog on as a service rights

Per stabilire i diritti Accesso come servizio per un account utente di servizio:To establish Log on as a service rights for a service user account:

  1. Aprire l'editor Criteri di sicurezza locali eseguendo secpol.msc.Open the Local Security Policy editor by running secpol.msc.
  2. Espandere il nodo Criteri locali e selezionare Assegnazione diritti utente.Expand the Local Policies node and select User Rights Assignment.
  3. Aprire il criterio Accesso come servizio.Open the Log on as a service policy.
  4. Selezionare Aggiungi utente o gruppo.Select Add User or Group.
  5. Specificare il nome oggetto (account utente) in uno dei modi seguenti:Provide the object name (user account) using either of the following approaches:
    1. Digitare l'account utente ({DOMAIN OR COMPUTER NAME\USER}) nel campo del nome oggetto e scegliere OK per aggiungere l'utente al criterio.Type the user account ({DOMAIN OR COMPUTER NAME\USER}) in the object name field and select OK to add the user to the policy.
    2. Fare clic su Avanzate.Select Advanced. Selezionare Trova.Select Find Now. Selezionare l'account utente dall'elenco.Select the user account from the list. Selezionare OK.Select OK. Scegliere di nuovo OK per aggiungere l'utente al criterio.Select OK again to add the user to the policy.
  6. Scegliere OK o Applica per accettare le modifiche.Select OK or Apply to accept the changes.

Creare e gestire il servizio di WindowsCreate and manage the Windows Service

Creare un servizioCreate a service

Usare i comandi di PowerShell per registrare un servizio.Use PowerShell commands to register a service. Da una shell dei comandi di PowerShell 6 amministrativa eseguire i comandi seguenti:From an administrative PowerShell 6 command shell, execute the following commands:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = {DOMAIN OR COMPUTER NAME\USER}, "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName {EXE FILE PATH} -Credential {DOMAIN OR COMPUTER NAME\USER} -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH} – percorso alla cartella dell'app nell'host, ad esempio d:\myservice.{EXE PATH} – Path to the app's folder on the host (for example, d:\myservice). Non includere l'eseguibile dell'app nel percorso.Don't include the app's executable in the path. Non è necessario aggiungere una barra finale.A trailing slash isn't required.
  • {DOMAIN OR COMPUTER NAME\USER} – account utente del servizio, ad esempio Contoso\ServiceUser.{DOMAIN OR COMPUTER NAME\USER} – Service user account (for example, Contoso\ServiceUser).
  • {SERVICE NAME} – nome del servizio (ad esempio, MyService).{SERVICE NAME} – Service name (for example, MyService).
  • {EXE FILE PATH} – percorso eseguibile dell'app, ad esempio d:\myservice\myservice.exe.{EXE FILE PATH} – The app's executable path (for example, d:\myservice\myservice.exe). Includere il nome del file eseguibile con l'estensione.Include the executable's file name with extension.
  • {DESCRIPTION} Descrizione del servizio –, ad esempio My sample service.{DESCRIPTION} – Service description (for example, My sample service).
  • {DISPLAY NAME} nome visualizzato del servizio –, ad esempio My Service.{DISPLAY NAME} – Service display name (for example, My Service).

Avviare un servizioStart a service

Per avviare un servizio, usare il comando di PowerShell 6 seguente:Start a service with the following PowerShell 6 command:

Start-Service -Name {SERVICE NAME}

L'avvio del servizio richiede alcuni secondi.The command takes a few seconds to start the service.

Determinare lo stato di un servizioDetermine a service's status

Per verificare lo stato di un servizio, usare il comando di PowerShell 6 seguente:To check the status of a service, use the following PowerShell 6 command:

Get-Service -Name {SERVICE NAME}

Lo stato viene indicato con uno dei valori seguenti:The status is reported as one of the following values:

  • Starting
  • Running
  • Stopping
  • Stopped

Arrestare un servizioStop a service

Per arrestare un servizio, usare il comando di PowerShell 6 seguente:Stop a service with the following Powershell 6 command:

Stop-Service -Name {SERVICE NAME}

Rimuovere un servizioRemove a service

Dopo il breve lasso di tempo necessario per arrestare un servizio, rimuovere il servizio con il comando di PowerShell 6 seguente:After a short delay to stop a service, remove a service with the following Powershell 6 command:

Remove-Service -Name {SERVICE NAME}

Gestire gli eventi di avvio e arrestoHandle starting and stopping events

Per gestire gli eventi OnStarting, OnStarted e OnStopping:To handle OnStarting, OnStarted, and OnStopping events:

  1. Creare una classe che deriva da WebHostService con i metodi OnStarting, OnStarted e OnStopping:Create a class that derives from WebHostService with the OnStarting, OnStarted, and OnStopping methods:

    [DesignerCategory("Code")]
    internal class CustomWebHostService : WebHostService
    {
        private ILogger _logger;
    
        public CustomWebHostService(IWebHost host) : base(host)
        {
            _logger = host.Services
                .GetRequiredService<ILogger<CustomWebHostService>>();
        }
    
        protected override void OnStarting(string[] args)
        {
            _logger.LogInformation("OnStarting method called.");
            base.OnStarting(args);
        }
    
        protected override void OnStarted()
        {
            _logger.LogInformation("OnStarted method called.");
            base.OnStarted();
        }
    
        protected override void OnStopping()
        {
            _logger.LogInformation("OnStopping method called.");
            base.OnStopping();
        }
    }
    
  2. Creare un metodo di estensione per IWebHost che passa CustomWebHostService a Run:Create an extension method for IWebHost that passes the CustomWebHostService to Run:

    public static class WebHostServiceExtensions
    {
        public static void RunAsCustomService(this IWebHost host)
        {
            var webHostService = new CustomWebHostService(host);
            ServiceBase.Run(webHostService);
        }
    }
    
  3. In Program.Main chiamare il metodo di estensione RunAsCustomService invece di RunAsService:In Program.Main, call the RunAsCustomService extension method instead of RunAsService:

    host.RunAsCustomService();
    

    Per visualizzare il percorso di RunAsService in Program.Main, fare riferimento all'esempio di codice illustrato nella sezione Tipo di distribuzione.To see the location of RunAsService in Program.Main, refer to the code sample shown in the Deployment type section.

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

I servizi che interagiscono con le richieste da Internet o da una rete aziendale e si trovano dietro un proxy o un servizio di bilanciamento del carico potrebbero richiedere una configurazione aggiuntiva.Services that interact with requests from the Internet or a corporate network and are behind a proxy or load balancer might require additional configuration. Per altre informazioni, vedere Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.For more information, see Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.

Configurare gli endpointConfigure endpoints

Per impostazione predefinita, ASP.NET Core è associato a http://localhost:5000.By default, ASP.NET Core binds to http://localhost:5000. Configurare l'URL e la porta impostando la variabile di ambiente ASPNETCORE_URLS.Configure the URL and port by setting the ASPNETCORE_URLS environment variable.

Per ulteriori approcci alla configurazione di porte e URL, vedere l'articolo relativo al server pertinente:For additional URL and port configuration approaches, see the relevant server article:

Le linee guida precedenti riguardano il supporto per gli endpoint HTTPS.The preceding guidance covers support for HTTPS endpoints. Ad esempio, configurare l'app per HTTPS quando si usa l'autenticazione con un servizio Windows.For example, configure the app for HTTPS when authentication is used with a Windows Service.

Nota

L'uso del certificato di sviluppo ASP.NET Core HTTPS per proteggere un endpoint del servizio non è supportato.Use of the ASP.NET Core HTTPS development certificate to secure a service endpoint isn't supported.

Directory corrente e radice del contenutoCurrent directory and content root

La directory di lavoro corrente restituita chiamando GetCurrentDirectory per un servizio Windows è la cartella C:\WINDOWS\system32.The current working directory returned by calling GetCurrentDirectory for a Windows Service is the C:\WINDOWS\system32 folder. La cartella system32 non è un percorso appropriato per archiviare i file di un servizio, ad esempio i file di impostazioni.The system32 folder isn't a suitable location to store a service's files (for example, settings files). Usare uno degli approcci seguenti per gestire e accedere agli asset e ai file di impostazioni di un servizio.Use one of the following approaches to maintain and access a service's assets and settings files.

Impostare il percorso radice del contenuto sulla cartella dell'appSet the content root path to the app's folder

ContentRootPath è lo stesso percorso fornito all'argomento binPath durante la creazione di un servizio.The ContentRootPath is the same path provided to the binPath argument when a service is created. Anziché chiamare GetCurrentDirectory per creare percorsi per i file di impostazioni, chiamare SetCurrentDirectory con il percorso della radice del contenutodell'app.Instead of calling GetCurrentDirectory to create paths to settings files, call SetCurrentDirectory with the path to the app's content root.

In Program.Main, determinare il percorso della cartella dell'eseguibile del servizio e usare il percorso per stabilire la radice del contenuto dell'app:In Program.Main, determine the path to the folder of the service's executable and use the path to establish the app's content root:

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);

CreateWebHostBuilder(args)
    .Build()
    .RunAsService();

Archiviare i file di un servizio in un percorso appropriato nel discoStore a service's files in a suitable location on disk

Specificare un percorso assoluto con SetBasePath quando si usa un IConfigurationBuilder per la cartella contenente i file.Specify an absolute path with SetBasePath when using an IConfigurationBuilder to the folder containing the files.

Risolvere problemiTroubleshoot

Per risolvere i problemi relativi a un'app di servizio Windows, vedere Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.To troubleshoot a Windows Service app, see Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.

Errori comuniCommon errors

  • È in uso una versione precedente o provvisoria di PowerShell.An old or pre-release version of PowerShell is in use.
  • Il servizio registrato non usa l'output pubblicato dell'app dal comando DotNet Publish .The registered service doesn't use the app's published output from the dotnet publish command. L'output del comando DotNet Build non è supportato per la distribuzione di app.Output of the dotnet build command isn't supported for app deployment. Gli asset pubblicati si trovano in una delle cartelle seguenti, a seconda del tipo di distribuzione:Published assets are found in either of the following folders depending on the deployment type:
    • bin/Release/{Target Framework}/Publish (FDD)bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{Target Framework}/{Runtime Identifier}/Publish (SCD)bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Il servizio non è nello stato in esecuzione.The service isn't in the RUNNING state.
  • I percorsi delle risorse utilizzate dall'app, ad esempio i certificati, non sono corretti.The paths to resources that the app uses (for example, certificates) are incorrect. Il percorso di base di un servizio Windows è c:\Windows\system32.The base path of a Windows Service is c:\Windows\System32.
  • L'utente non dispone di diritti di accesso come servizio .The user doesn't have Log on as a service rights.
  • La password dell'utente è scaduta o non è stata passata correttamente durante l'esecuzione del comando New-Service PowerShell.The user's password is expired or incorrectly passed when executing the New-Service PowerShell command.
  • L'app richiede l'autenticazione ASP.NET Core ma non è configurata per le connessioni protette (HTTPS).The app requires ASP.NET Core authentication but isn't configured for secure connections (HTTPS).
  • La porta dell'URL della richiesta non è corretta o non è configurata correttamente nell'app.The request URL port is incorrect or not configured correctly in the app.

Log eventi di sistema e dell'applicazioneSystem and Application Event Logs

Accedere ai registri eventi di sistema e dell'applicazione:Access the System and Application Event Logs:

  1. Aprire il menu Start, cercare Visualizzatore eventie selezionare l'app Visualizzatore eventi .Open the Start menu, search for Event Viewer, and select the Event Viewer app.
  2. In Visualizzatore eventi aprire il nodo Registri di Windows.In Event Viewer, open the Windows Logs node.
  3. Selezionare sistema per aprire il registro eventi di sistema.Select System to open the System Event Log. Selezionare Applicazione per aprire il log eventi dell'applicazione.Select Application to open the Application Event Log.
  4. Cercare gli errori associati all'app in cui si è verificato il problema.Search for errors associated with the failing app.

Eseguire l'app da un prompt dei comandiRun the app at a command prompt

Molti errori di avvio non producono informazioni utili nei log eventi.Many startup errors don't produce useful information in the event logs. È possibile individuare la causa di alcuni errori eseguendo l'app da un prompt dei comandi nel sistema host.You can find the cause of some errors by running the app at a command prompt on the hosting system. Per registrare dettagli aggiuntivi dall'app, abbassare il livello di registrazione o eseguire l'app nell' ambiente di sviluppo.To log additional detail from the app, lower the log level or run the app in the Development environment.

Cancella cache di pacchettiClear package caches

Un'app funzionante potrebbe non riuscire immediatamente dopo l'aggiornamento del .NET Core SDK nel computer di sviluppo o la modifica delle versioni del pacchetto all'interno dell'app.A functioning app may fail immediately after upgrading either the .NET Core SDK on the development machine or changing package versions within the app. In alcuni casi i pacchetti incoerenti possono interrompere un'app quando si eseguono aggiornamenti principali.In some cases, incoherent packages may break an app when performing major upgrades. La maggior parte di questi problemi può essere risolta attenendosi alle istruzioni seguenti:Most of these issues can be fixed by following these instructions:

  1. Eliminare le cartelle bin e obj.Delete the bin and obj folders.

  2. Cancellare le cache dei pacchetti eseguendo le impostazioni locali di DotNet NuGet All--Clear da una shell dei comandi.Clear the package caches by executing dotnet nuget locals all --clear from a command shell.

    La cancellazione delle cache dei pacchetti può essere eseguita anche con lo strumento NuGet. exe ed eseguendo il comando nuget locals all -clear.Clearing package caches can also be accomplished with the nuget.exe tool and executing the command nuget locals all -clear. nuget.exe non è un'installazione inclusa con il sistema operativo desktop Windows e deve essere ottenuta separatamente dal sito Web NuGet.nuget.exe isn't a bundled install with the Windows desktop operating system and must be obtained separately from the NuGet website.

  3. Ripristinare e ricompilare il progetto.Restore and rebuild the project.

  4. Eliminare tutti i file nella cartella di distribuzione nel server prima di ridistribuire l'app.Delete all of the files in the deployment folder on the server prior to redeploying the app.

App lenta o bloccataSlow or hanging app

Un dump di arresto anomalo del sistema è uno snapshot della memoria del sistema e può contribuire a determinare la provocazione di un arresto anomalo dell'app, dell'avvio o dell'applicazione lenta.A crash dump is a snapshot of the system's memory and can help determine the cause of an app crash, startup failure, or slow app.

Arresto anomalo o eccezione di un'appApp crashes or encounters an exception

Ottenere e analizzare un dump da Segnalazione errori Windows:Obtain and analyze a dump from Windows Error Reporting (WER):

  1. Creare una cartella per i file dump di arresto anomalo del sistema in c:\dumps.Create a folder to hold crash dump files at c:\dumps.

  2. Eseguire lo script di PowerShell EnableDumps con il nome dell'eseguibile dell'applicazione:Run the EnableDumps PowerShell script with the application executable name:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Eseguire l'app nelle condizioni che causano l'arresto anomalo.Run the app under the conditions that cause the crash to occur.

  4. Dopo che si è verificato l'arresto anomalo, eseguire lo script di PowerShell DisableDumps:After the crash has occurred, run the DisableDumps PowerShell script:

    .\DisableDumps {APPLICATION EXE}
    

Dopo l'arresto anomalo di un'app e la raccolta dei dump, l'app può terminare normalmente.After an app crashes and dump collection is complete, the app is allowed to terminate normally. Lo script di PowerShell configura Segnalazione errori Windows per raccogliere fino a cinque dump per ogni app.The PowerShell script configures WER to collect up to five dumps per app.

Avviso

I dump di arresto anomalo del sistema potrebbero richiedere una grande quantità di spazio su disco (fino a diversi gigabyte ognuno).Crash dumps might take up a large amount of disk space (up to several gigabytes each).

L'app si blocca, si verifica un errore durante l'avvio o viene eseguita normalmenteApp hangs, fails during startup, or runs normally

Quando un'app si blocca (smette di rispondere ma non si arresta in modo anomalo), si verifica un errore durante l'avvio o viene eseguita normalmente, vedere file di dump in modalità utente: scegliere lo strumento migliore per selezionare uno strumento appropriato per produrre il dump.When an app hangs (stops responding but doesn't crash), fails during startup, or runs normally, see User-Mode Dump Files: Choosing the Best Tool to select an appropriate tool to produce the dump.

Analizzare il dumpAnalyze the dump

È possibile analizzare un dump usando diversi approcci.A dump can be analyzed using several approaches. Per altre informazioni, vedere Analyzing a User-Mode Dump File (Analisi di un file dump in modalità utente).For more information, see Analyzing a User-Mode Dump File.

Risorse aggiuntiveAdditional resources

È possibile ospitare un'app ASP.NET Core in Windows come servizio Windows senza usare IIS.An ASP.NET Core app can be hosted on Windows as a Windows Service without using IIS. Quando è ospitata come servizio di Windows, l'app viene avviata automaticamente dopo il riavvio del server.When hosted as a Windows Service, the app automatically starts after server reboots.

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

PrerequisitesPrerequisites

Configurazione dell'appApp configuration

L'app richiede i riferimenti ai pacchetti Microsoft.AspNetCore.Hosting.WindowsServices e Microsoft.Extensions.Logging.EventLog.The app requires package references for Microsoft.AspNetCore.Hosting.WindowsServices and Microsoft.Extensions.Logging.EventLog.

Per eseguire test e debug durante l'esecuzione all'esterno di un servizio, aggiungere il codice per determinare se l'app è in esecuzione come servizio o è un'app console.To test and debug when running outside of a service, add code to determine if the app is running as a service or a console app. Controllare se il debugger è collegato o se è presente un'opzione --console.Inspect if the debugger is attached or a --console switch is present. Se una delle due condizioni è vera (l'app non è eseguita come servizio), chiamare Run.If either condition is true (the app isn't run as a service), call Run. Se le condizioni sono false (l'app è eseguita come servizio):If the conditions are false (the app is run as a service):

Dato che il provider di configurazione della riga di comando richiede coppie nome-valore per gli argomenti della riga di comando, l'opzione --console viene rimossa dagli argomenti prima che CreateDefaultBuilder riceva gli argomenti.Because the Command-line Configuration Provider requires name-value pairs for command-line arguments, the --console switch is removed from the arguments before CreateDefaultBuilder receives the arguments.

Per scrivere nel registro eventi di Windows, aggiungere il provider EventLog a ConfigureLogging.To write to the Windows Event Log, add the EventLog provider to ConfigureLogging. Impostare il livello di registrazione con la chiave Logging:LogLevel:Default nel file appsettings.Production.json.Set the logging level with the Logging:LogLevel:Default key in the appsettings.Production.json file.

Nel seguente esempio dell'app di esempio, viene chiamato RunAsCustomService invece di RunAsService per gestire gli eventi di durata all'interno dell'app.In the following example from the sample app, RunAsCustomService is called instead of RunAsService in order to handle lifetime events within the app. Per altre informazioni, vedere la sezione Gestire gli eventi di avvio e arresto.For more information, see the Handle starting and stopping events section.

public class Program
{
    public static void Main(string[] args)
    {
        var isService = !(Debugger.IsAttached || args.Contains("--console"));
        
        if (isService)
        {
            var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
            var pathToContentRoot = Path.GetDirectoryName(pathToExe);
            Directory.SetCurrentDirectory(pathToContentRoot);
        }

        var builder = CreateWebHostBuilder(
            args.Where(arg => arg != "--console").ToArray());

        var host = builder.Build();

        if (isService)
        {
            // To run the app without the CustomWebHostService change the
            // next line to host.RunAsService();
            host.RunAsCustomService();
        }
        else
        {
            host.Run();
        }
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext, logging) =>
            {
                logging.AddEventLog();
            })
            .ConfigureAppConfiguration((context, config) =>
            {
                // Configure the app here.
            })
            .UseStartup<Startup>();
}

Tipo di distribuzioneDeployment type

Per informazioni e consigli sugli scenari di distribuzione, vedere Distribuzione di applicazioni .NET Core.For information and advice on deployment scenarios, see .NET Core application deployment.

SDKSDK

Per un servizio basato su app Web che usa i Framework Razor Pages o MVC, specificare Web SDK nel file di progetto:For a web app-based service that uses the Razor Pages or MVC frameworks, specify the Web SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Web">

Se il servizio esegue solo attività in background, ad esempio servizi ospitati, specificare l'SDK del ruolo di lavoro nel file di progetto:If the service only executes background tasks (for example, hosted services), specify the Worker SDK in the project file:

<Project Sdk="Microsoft.NET.Sdk.Worker">

Distribuzione dipendente dal frameworkFramework-dependent deployment (FDD)

La distribuzione dipendente dal framework si basa sulla presenza di una versione condivisa a livello di sistema di .NET Core nel sistema di destinazione.Framework-dependent deployment (FDD) relies on the presence of a shared system-wide version of .NET Core on the target system. Quando lo scenario di distribuzione dipendente dal framework viene implementato in base alle indicazioni di questo articolo, l'SDK genera un file eseguibile (con estensione exe) detto eseguibile dipendente dal framework.When the FDD scenario is adopted following the guidance in this article, the SDK produces an executable (.exe), called a framework-dependent executable.

L'identificatore di runtime (RID) di Windows (<RuntimeIdentifier>) contiene il framework di destinazione.The Windows Runtime Identifier (RID) (<RuntimeIdentifier>) contains the target framework. Nell'esempio seguente il RID è impostato su win7-x64.In the following example, the RID is set to win7-x64. La proprietà <SelfContained> è impostata su false.The <SelfContained> property is set to false. Queste proprietà indicano all'SDK di generare un file eseguibile (con estensione exe) per Windows e un'app che dipende dal framework .NET Core condiviso.These properties instruct the SDK to generate an executable (.exe) file for Windows and an app that depends on the shared .NET Core framework.

La proprietà <UseAppHost> è impostata su true.The <UseAppHost> property is set to true. Questa proprietà fornisce il servizio con un percorso di attivazione (un file eseguibile, .exe) per una distribuzione dipendente dal framework.This property provides the service with an activation path (an executable, .exe) for an FDD.

Un file web.config, che viene normalmente generato quando si pubblica un'app ASP.NET Core, non è necessario per un'app di servizi Windows.A web.config file, which is normally produced when publishing an ASP.NET Core app, is unnecessary for a Windows Services app. Per disabilitare la creazione del file web.config, aggiungere la proprietà <IsTransformWebConfigDisabled> impostata su true.To disable the creation of the web.config file, add the <IsTransformWebConfigDisabled> property set to true.

<PropertyGroup>
  <TargetFramework>netcoreapp2.2</TargetFramework>
  <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
  <UseAppHost>true</UseAppHost>
  <SelfContained>false</SelfContained>
  <IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>

Distribuzione autonomaSelf-contained deployment (SCD)

Una distribuzione autonoma non si basa sulla presenza di un framework condiviso nel sistema host.Self-contained deployment (SCD) doesn't rely on the presence of a shared framework on the host system. Il runtime e le dipendenze dell'app vengono distribuiti con l'app.The runtime and the app's dependencies are deployed with the app.

Un identificatore di runtime (RID) di Windows viene incluso nel <PropertyGroup> che contiene il framework di destinazione:A Windows Runtime Identifier (RID) is included in the <PropertyGroup> that contains the target framework:

<RuntimeIdentifier>win7-x64</RuntimeIdentifier>

Per eseguire la pubblicazione per più identificatori di runtime:To publish for multiple RIDs:

  • Specificare gli identificatori di runtime in un elenco delimitato da punto e virgola.Provide the RIDs in a semicolon-delimited list.
  • Usare il nome di proprietà <RuntimeIdentifiers> (plurale).Use the property name <RuntimeIdentifiers> (plural).

Per altre informazioni, vedere il Catalogo RID di .NET Core.For more information, see .NET Core RID Catalog.

Una proprietà <SelfContained> è impostata su true:A <SelfContained> property is set to true:

<SelfContained>true</SelfContained>

Account utente del servizioService user account

Per creare un account utente per un servizio, usare il cmdlet New-LocalUser da una shell dei comandi di PowerShell 6 amministrativa.To create a user account for a service, use the New-LocalUser cmdlet from an administrative PowerShell 6 command shell.

In Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763) o versioni successive:On Windows 10 October 2018 Update (version 1809/build 10.0.17763) or later:

New-LocalUser -Name {SERVICE NAME}

In un sistema operativo Windows precedente ad Aggiornamento di Windows 10 (ottobre 2018) (versione 1809/build 10.0.17763):On Windows OS earlier than the Windows 10 October 2018 Update (version 1809/build 10.0.17763):

powershell -Command "New-LocalUser -Name {SERVICE NAME}"

Fornire una password complessa quando richiesto.Provide a strong password when prompted.

Se non viene specificato il parametro -AccountExpires per il cmdlet New-LocalUser con un valore DateTime di scadenza, l'account non scade.Unless the -AccountExpires parameter is supplied to the New-LocalUser cmdlet with an expiration DateTime, the account doesn't expire.

Per altre informazioni, vedere Microsoft.PowerShell.LocalAccounts e Service User Accounts (Account utente di servizio).For more information, see Microsoft.PowerShell.LocalAccounts and Service User Accounts.

Un approccio alternativo per la gestione degli utenti quando si usa Active Directory consiste nell'usare account del servizio gestito.An alternative approach to managing users when using Active Directory is to use Managed Service Accounts. Per altre informazioni, vedere Panoramica degli account del servizio gestito del gruppo.For more information, see Group Managed Service Accounts Overview.

Diritti Accesso come servizioLog on as a service rights

Per stabilire i diritti Accesso come servizio per un account utente di servizio:To establish Log on as a service rights for a service user account:

  1. Aprire l'editor Criteri di sicurezza locali eseguendo secpol.msc.Open the Local Security Policy editor by running secpol.msc.
  2. Espandere il nodo Criteri locali e selezionare Assegnazione diritti utente.Expand the Local Policies node and select User Rights Assignment.
  3. Aprire il criterio Accesso come servizio.Open the Log on as a service policy.
  4. Selezionare Aggiungi utente o gruppo.Select Add User or Group.
  5. Specificare il nome oggetto (account utente) in uno dei modi seguenti:Provide the object name (user account) using either of the following approaches:
    1. Digitare l'account utente ({DOMAIN OR COMPUTER NAME\USER}) nel campo del nome oggetto e scegliere OK per aggiungere l'utente al criterio.Type the user account ({DOMAIN OR COMPUTER NAME\USER}) in the object name field and select OK to add the user to the policy.
    2. Fare clic su Avanzate.Select Advanced. Selezionare Trova.Select Find Now. Selezionare l'account utente dall'elenco.Select the user account from the list. Selezionare OK.Select OK. Scegliere di nuovo OK per aggiungere l'utente al criterio.Select OK again to add the user to the policy.
  6. Scegliere OK o Applica per accettare le modifiche.Select OK or Apply to accept the changes.

Creare e gestire il servizio di WindowsCreate and manage the Windows Service

Creare un servizioCreate a service

Usare i comandi di PowerShell per registrare un servizio.Use PowerShell commands to register a service. Da una shell dei comandi di PowerShell 6 amministrativa eseguire i comandi seguenti:From an administrative PowerShell 6 command shell, execute the following commands:

$acl = Get-Acl "{EXE PATH}"
$aclRuleArgs = {DOMAIN OR COMPUTER NAME\USER}, "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "{EXE PATH}"

New-Service -Name {SERVICE NAME} -BinaryPathName {EXE FILE PATH} -Credential {DOMAIN OR COMPUTER NAME\USER} -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
  • {EXE PATH} – percorso alla cartella dell'app nell'host, ad esempio d:\myservice.{EXE PATH} – Path to the app's folder on the host (for example, d:\myservice). Non includere l'eseguibile dell'app nel percorso.Don't include the app's executable in the path. Non è necessario aggiungere una barra finale.A trailing slash isn't required.
  • {DOMAIN OR COMPUTER NAME\USER} – account utente del servizio, ad esempio Contoso\ServiceUser.{DOMAIN OR COMPUTER NAME\USER} – Service user account (for example, Contoso\ServiceUser).
  • {SERVICE NAME} – nome del servizio (ad esempio, MyService).{SERVICE NAME} – Service name (for example, MyService).
  • {EXE FILE PATH} – percorso eseguibile dell'app, ad esempio d:\myservice\myservice.exe.{EXE FILE PATH} – The app's executable path (for example, d:\myservice\myservice.exe). Includere il nome del file eseguibile con l'estensione.Include the executable's file name with extension.
  • {DESCRIPTION} Descrizione del servizio –, ad esempio My sample service.{DESCRIPTION} – Service description (for example, My sample service).
  • {DISPLAY NAME} nome visualizzato del servizio –, ad esempio My Service.{DISPLAY NAME} – Service display name (for example, My Service).

Avviare un servizioStart a service

Per avviare un servizio, usare il comando di PowerShell 6 seguente:Start a service with the following PowerShell 6 command:

Start-Service -Name {SERVICE NAME}

L'avvio del servizio richiede alcuni secondi.The command takes a few seconds to start the service.

Determinare lo stato di un servizioDetermine a service's status

Per verificare lo stato di un servizio, usare il comando di PowerShell 6 seguente:To check the status of a service, use the following PowerShell 6 command:

Get-Service -Name {SERVICE NAME}

Lo stato viene indicato con uno dei valori seguenti:The status is reported as one of the following values:

  • Starting
  • Running
  • Stopping
  • Stopped

Arrestare un servizioStop a service

Per arrestare un servizio, usare il comando di PowerShell 6 seguente:Stop a service with the following Powershell 6 command:

Stop-Service -Name {SERVICE NAME}

Rimuovere un servizioRemove a service

Dopo il breve lasso di tempo necessario per arrestare un servizio, rimuovere il servizio con il comando di PowerShell 6 seguente:After a short delay to stop a service, remove a service with the following Powershell 6 command:

Remove-Service -Name {SERVICE NAME}

Gestire gli eventi di avvio e arrestoHandle starting and stopping events

Per gestire gli eventi OnStarting, OnStarted e OnStopping:To handle OnStarting, OnStarted, and OnStopping events:

  1. Creare una classe che deriva da WebHostService con i metodi OnStarting, OnStarted e OnStopping:Create a class that derives from WebHostService with the OnStarting, OnStarted, and OnStopping methods:

    [DesignerCategory("Code")]
    internal class CustomWebHostService : WebHostService
    {
        private ILogger _logger;
    
        public CustomWebHostService(IWebHost host) : base(host)
        {
            _logger = host.Services
                .GetRequiredService<ILogger<CustomWebHostService>>();
        }
    
        protected override void OnStarting(string[] args)
        {
            _logger.LogInformation("OnStarting method called.");
            base.OnStarting(args);
        }
    
        protected override void OnStarted()
        {
            _logger.LogInformation("OnStarted method called.");
            base.OnStarted();
        }
    
        protected override void OnStopping()
        {
            _logger.LogInformation("OnStopping method called.");
            base.OnStopping();
        }
    }
    
  2. Creare un metodo di estensione per IWebHost che passa CustomWebHostService a Run:Create an extension method for IWebHost that passes the CustomWebHostService to Run:

    public static class WebHostServiceExtensions
    {
        public static void RunAsCustomService(this IWebHost host)
        {
            var webHostService = new CustomWebHostService(host);
            ServiceBase.Run(webHostService);
        }
    }
    
  3. In Program.Main chiamare il metodo di estensione RunAsCustomService invece di RunAsService:In Program.Main, call the RunAsCustomService extension method instead of RunAsService:

    host.RunAsCustomService();
    

    Per visualizzare il percorso di RunAsService in Program.Main, fare riferimento all'esempio di codice illustrato nella sezione Tipo di distribuzione.To see the location of RunAsService in Program.Main, refer to the code sample shown in the Deployment type section.

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

I servizi che interagiscono con le richieste da Internet o da una rete aziendale e si trovano dietro un proxy o un servizio di bilanciamento del carico potrebbero richiedere una configurazione aggiuntiva.Services that interact with requests from the Internet or a corporate network and are behind a proxy or load balancer might require additional configuration. Per altre informazioni, vedere Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.For more information, see Configurare ASP.NET Core per l'uso di server proxy e servizi di bilanciamento del carico.

Configurare gli endpointConfigure endpoints

Per impostazione predefinita, ASP.NET Core è associato a http://localhost:5000.By default, ASP.NET Core binds to http://localhost:5000. Configurare l'URL e la porta impostando la variabile di ambiente ASPNETCORE_URLS.Configure the URL and port by setting the ASPNETCORE_URLS environment variable.

Per ulteriori approcci alla configurazione di porte e URL, vedere l'articolo relativo al server pertinente:For additional URL and port configuration approaches, see the relevant server article:

Le linee guida precedenti riguardano il supporto per gli endpoint HTTPS.The preceding guidance covers support for HTTPS endpoints. Ad esempio, configurare l'app per HTTPS quando si usa l'autenticazione con un servizio Windows.For example, configure the app for HTTPS when authentication is used with a Windows Service.

Nota

L'uso del certificato di sviluppo ASP.NET Core HTTPS per proteggere un endpoint del servizio non è supportato.Use of the ASP.NET Core HTTPS development certificate to secure a service endpoint isn't supported.

Directory corrente e radice del contenutoCurrent directory and content root

La directory di lavoro corrente restituita chiamando GetCurrentDirectory per un servizio Windows è la cartella C:\WINDOWS\system32.The current working directory returned by calling GetCurrentDirectory for a Windows Service is the C:\WINDOWS\system32 folder. La cartella system32 non è un percorso appropriato per archiviare i file di un servizio, ad esempio i file di impostazioni.The system32 folder isn't a suitable location to store a service's files (for example, settings files). Usare uno degli approcci seguenti per gestire e accedere agli asset e ai file di impostazioni di un servizio.Use one of the following approaches to maintain and access a service's assets and settings files.

Impostare il percorso radice del contenuto sulla cartella dell'appSet the content root path to the app's folder

ContentRootPath è lo stesso percorso fornito all'argomento binPath durante la creazione di un servizio.The ContentRootPath is the same path provided to the binPath argument when a service is created. Anziché chiamare GetCurrentDirectory per creare percorsi per i file di impostazioni, chiamare SetCurrentDirectory con il percorso della radice del contenutodell'app.Instead of calling GetCurrentDirectory to create paths to settings files, call SetCurrentDirectory with the path to the app's content root.

In Program.Main, determinare il percorso della cartella dell'eseguibile del servizio e usare il percorso per stabilire la radice del contenuto dell'app:In Program.Main, determine the path to the folder of the service's executable and use the path to establish the app's content root:

var pathToExe = Process.GetCurrentProcess().MainModule.FileName;
var pathToContentRoot = Path.GetDirectoryName(pathToExe);
Directory.SetCurrentDirectory(pathToContentRoot);

CreateWebHostBuilder(args)
    .Build()
    .RunAsService();

Archiviare i file di un servizio in un percorso appropriato nel discoStore a service's files in a suitable location on disk

Specificare un percorso assoluto con SetBasePath quando si usa un IConfigurationBuilder per la cartella contenente i file.Specify an absolute path with SetBasePath when using an IConfigurationBuilder to the folder containing the files.

Risolvere problemiTroubleshoot

Per risolvere i problemi relativi a un'app di servizio Windows, vedere Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.To troubleshoot a Windows Service app, see Risolvere i problemi ed eseguire il debug di progetti ASP.NET Core.

Errori comuniCommon errors

  • È in uso una versione precedente o provvisoria di PowerShell.An old or pre-release version of PowerShell is in use.
  • Il servizio registrato non usa l'output pubblicato dell'app dal comando DotNet Publish .The registered service doesn't use the app's published output from the dotnet publish command. L'output del comando DotNet Build non è supportato per la distribuzione di app.Output of the dotnet build command isn't supported for app deployment. Gli asset pubblicati si trovano in una delle cartelle seguenti, a seconda del tipo di distribuzione:Published assets are found in either of the following folders depending on the deployment type:
    • bin/Release/{Target Framework}/Publish (FDD)bin/Release/{TARGET FRAMEWORK}/publish (FDD)
    • bin/Release/{Target Framework}/{Runtime Identifier}/Publish (SCD)bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
  • Il servizio non è nello stato in esecuzione.The service isn't in the RUNNING state.
  • I percorsi delle risorse utilizzate dall'app, ad esempio i certificati, non sono corretti.The paths to resources that the app uses (for example, certificates) are incorrect. Il percorso di base di un servizio Windows è c:\Windows\system32.The base path of a Windows Service is c:\Windows\System32.
  • L'utente non dispone di diritti di accesso come servizio .The user doesn't have Log on as a service rights.
  • La password dell'utente è scaduta o non è stata passata correttamente durante l'esecuzione del comando New-Service PowerShell.The user's password is expired or incorrectly passed when executing the New-Service PowerShell command.
  • L'app richiede l'autenticazione ASP.NET Core ma non è configurata per le connessioni protette (HTTPS).The app requires ASP.NET Core authentication but isn't configured for secure connections (HTTPS).
  • La porta dell'URL della richiesta non è corretta o non è configurata correttamente nell'app.The request URL port is incorrect or not configured correctly in the app.

Log eventi di sistema e dell'applicazioneSystem and Application Event Logs

Accedere ai registri eventi di sistema e dell'applicazione:Access the System and Application Event Logs:

  1. Aprire il menu Start, cercare Visualizzatore eventie selezionare l'app Visualizzatore eventi .Open the Start menu, search for Event Viewer, and select the Event Viewer app.
  2. In Visualizzatore eventi aprire il nodo Registri di Windows.In Event Viewer, open the Windows Logs node.
  3. Selezionare sistema per aprire il registro eventi di sistema.Select System to open the System Event Log. Selezionare Applicazione per aprire il log eventi dell'applicazione.Select Application to open the Application Event Log.
  4. Cercare gli errori associati all'app in cui si è verificato il problema.Search for errors associated with the failing app.

Eseguire l'app da un prompt dei comandiRun the app at a command prompt

Molti errori di avvio non producono informazioni utili nei log eventi.Many startup errors don't produce useful information in the event logs. È possibile individuare la causa di alcuni errori eseguendo l'app da un prompt dei comandi nel sistema host.You can find the cause of some errors by running the app at a command prompt on the hosting system. Per registrare dettagli aggiuntivi dall'app, abbassare il livello di registrazione o eseguire l'app nell' ambiente di sviluppo.To log additional detail from the app, lower the log level or run the app in the Development environment.

Cancella cache di pacchettiClear package caches

Un'app funzionante potrebbe non riuscire immediatamente dopo l'aggiornamento del .NET Core SDK nel computer di sviluppo o la modifica delle versioni del pacchetto all'interno dell'app.A functioning app may fail immediately after upgrading either the .NET Core SDK on the development machine or changing package versions within the app. In alcuni casi i pacchetti incoerenti possono interrompere un'app quando si eseguono aggiornamenti principali.In some cases, incoherent packages may break an app when performing major upgrades. La maggior parte di questi problemi può essere risolta attenendosi alle istruzioni seguenti:Most of these issues can be fixed by following these instructions:

  1. Eliminare le cartelle bin e obj.Delete the bin and obj folders.

  2. Cancellare le cache dei pacchetti eseguendo le impostazioni locali di DotNet NuGet All--Clear da una shell dei comandi.Clear the package caches by executing dotnet nuget locals all --clear from a command shell.

    La cancellazione delle cache dei pacchetti può essere eseguita anche con lo strumento NuGet. exe ed eseguendo il comando nuget locals all -clear.Clearing package caches can also be accomplished with the nuget.exe tool and executing the command nuget locals all -clear. nuget.exe non è un'installazione inclusa con il sistema operativo desktop Windows e deve essere ottenuta separatamente dal sito Web NuGet.nuget.exe isn't a bundled install with the Windows desktop operating system and must be obtained separately from the NuGet website.

  3. Ripristinare e ricompilare il progetto.Restore and rebuild the project.

  4. Eliminare tutti i file nella cartella di distribuzione nel server prima di ridistribuire l'app.Delete all of the files in the deployment folder on the server prior to redeploying the app.

App lenta o bloccataSlow or hanging app

Un dump di arresto anomalo del sistema è uno snapshot della memoria del sistema e può contribuire a determinare la provocazione di un arresto anomalo dell'app, dell'avvio o dell'applicazione lenta.A crash dump is a snapshot of the system's memory and can help determine the cause of an app crash, startup failure, or slow app.

Arresto anomalo o eccezione di un'appApp crashes or encounters an exception

Ottenere e analizzare un dump da Segnalazione errori Windows:Obtain and analyze a dump from Windows Error Reporting (WER):

  1. Creare una cartella per i file dump di arresto anomalo del sistema in c:\dumps.Create a folder to hold crash dump files at c:\dumps.

  2. Eseguire lo script di PowerShell EnableDumps con il nome dell'eseguibile dell'applicazione:Run the EnableDumps PowerShell script with the application executable name:

    .\EnableDumps {APPLICATION EXE} c:\dumps
    
  3. Eseguire l'app nelle condizioni che causano l'arresto anomalo.Run the app under the conditions that cause the crash to occur.

  4. Dopo che si è verificato l'arresto anomalo, eseguire lo script di PowerShell DisableDumps:After the crash has occurred, run the DisableDumps PowerShell script:

    .\DisableDumps {APPLICATION EXE}
    

Dopo l'arresto anomalo di un'app e la raccolta dei dump, l'app può terminare normalmente.After an app crashes and dump collection is complete, the app is allowed to terminate normally. Lo script di PowerShell configura Segnalazione errori Windows per raccogliere fino a cinque dump per ogni app.The PowerShell script configures WER to collect up to five dumps per app.

Avviso

I dump di arresto anomalo del sistema potrebbero richiedere una grande quantità di spazio su disco (fino a diversi gigabyte ognuno).Crash dumps might take up a large amount of disk space (up to several gigabytes each).

L'app si blocca, si verifica un errore durante l'avvio o viene eseguita normalmenteApp hangs, fails during startup, or runs normally

Quando un'app si blocca (smette di rispondere ma non si arresta in modo anomalo), si verifica un errore durante l'avvio o viene eseguita normalmente, vedere file di dump in modalità utente: scegliere lo strumento migliore per selezionare uno strumento appropriato per produrre il dump.When an app hangs (stops responding but doesn't crash), fails during startup, or runs normally, see User-Mode Dump Files: Choosing the Best Tool to select an appropriate tool to produce the dump.

Analizzare il dumpAnalyze the dump

È possibile analizzare un dump usando diversi approcci.A dump can be analyzed using several approaches. Per altre informazioni, vedere Analyzing a User-Mode Dump File (Analisi di un file dump in modalità utente).For more information, see Analyzing a User-Mode Dump File.

Risorse aggiuntiveAdditional resources