Host ASP.NET Core em um serviço do Windows
Observação
Esta não é a versão mais recente deste artigo. Para a versão atual, consulte a versão .NET 9 deste artigo.
Advertência
Esta versão do ASP.NET Core não é mais suportada. Para obter mais informações, consulte a Política de suporte do .NET e .NET Core. Para a versão atual, consulte a versão .NET 9 deste artigo.
Importante
Estas informações referem-se a um produto de pré-lançamento que pode ser substancialmente modificado antes de ser lançado comercialmente. A Microsoft não oferece garantias, expressas ou implícitas, em relação às informações fornecidas aqui.
Para a versão atual, consulte a versão .NET 9 deste artigo.
Um aplicativo ASP.NET Core pode ser hospedado no Windows como um de serviço do Windows
Pré-requisitos
Modelo de Serviço do Trabalhador
O modelo ASP.NET Core Worker Service fornece um ponto de partida para escrever aplicativos de serviço de longa execução. Para usar o modelo como base para um aplicativo de serviço do Windows:
- Crie um aplicativo do Serviço de Trabalho a partir do modelo .NET Core.
- Instale o pacote NuGet Microsoft.Extensions.Hosting.WindowsServices.
- Siga as orientações na seção de configuração do Aplicativo
para atualizar o aplicativo Serviço de Trabalho para que ele possa ser executado como um Serviço do Windows.
- Visual Studio
- Visual Studio para Mac
- da CLI do .NET
- Crie um novo projeto.
- Selecione Serviço de Trabalhador. Selecione Avançar.
- Forneça um nome de projeto no campo Nome do projeto ou aceite o nome do projeto padrão. Selecione Criar.
- Na caixa de diálogo Criar um novo serviço de trabalho, selecione Criar.
Configuração do aplicativo
Atualize Program.cs para chamar AddWindowsService. Quando o aplicativo estiver sendo executado como um serviço do Windows, AddWindowsService
:
- Define o tempo de vida do host como
WindowsServiceLifetime
. - Define como raiz de conteúdo para AppContext.BaseDirectory. Para obter mais informações, consulte a seção "Diretório Atual" e "Raiz do Conteúdo".
- Permite o registo no log de eventos.
- O nome do aplicativo é usado como o nome de origem padrão.
- O nível de registo padrão é Aviso ou mais alto para uma aplicação baseada num modelo ASP.NET Core que chama
CreateDefaultBuilder
para construir o anfitrião. - Substitua o nível de log predefinido pela chave
Logging:EventLog:LogLevel:Default
emappsettings.json
/appsettings.{Environment}.json
ou noutro fornecedor de configuração. - Apenas os administradores podem criar novas fontes de eventos. Quando não é possível criar uma fonte de eventos usando o nome da aplicação, um aviso é registrado na origem Application e os logs de eventos são desativados.
Considere a seguinte classe ServiceA
:
namespace SampleApp.Services;
public class ServiceA : BackgroundService
{
public ServiceA(ILoggerFactory loggerFactory)
{
Logger = loggerFactory.CreateLogger<ServiceA>();
}
public ILogger Logger { get; }
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
Logger.LogInformation("ServiceA is starting.");
stoppingToken.Register(() => Logger.LogInformation("ServiceA is stopping."));
while (!stoppingToken.IsCancellationRequested)
{
Logger.LogInformation("ServiceA is doing background work.");
await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
}
Logger.LogInformation("ServiceA has stopped.");
}
}
O seguinte Program.cs
chama AddHostedService
para registrar ServiceA
:
using SampleApp.Services;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddWindowsService();
builder.Services.AddHostedService<ServiceA>();
var app = builder.Build();
app.MapRazorPages();
app.Run();
Os seguintes aplicativos de exemplo acompanham este tópico:
- Exemplo de Serviço de Trabalhador em Segundo Plano: um exemplo de aplicativo não Web baseado no modelo Serviço de Trabalhador que usa de serviços hospedados para tarefas em segundo plano.
- Exemplo de Serviço de Aplicação Web: um exemplo de aplicação web Razor Páginas que é executado como um Serviço do Windows com serviços hospedados para tarefas em segundo plano.
Para obter orientação sobre MVC, consulte os artigos sob Visão geral do ASP.NET Core MVC e Migrar do ASP.NET Core 2.2 para 3.0.
Tipo de implantação
Para obter informações e conselhos sobre cenários de implantação, consulte : implantação de aplicativos .NET Core.
SDK
Para um serviço baseado em aplicativo Web que usa as estruturas Razor Pages ou MVC, especifique o SDK da Web no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Web">
Se o serviço executar apenas tarefas em segundo plano (por exemplo, serviços hospedados), especifique o SDK do trabalhador no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Implementação dependente de plataforma (FDD)
A implementação dependente de framework (FDD) depende da presença de uma versão compartilhada do .NET Core em todo o sistema de destino. Quando o cenário FDD é adotado de acordo com as orientações deste artigo, o SDK produz um executável (
Se estiver usando o Web SDK, um arquivo web.config, que normalmente é produzido ao publicar um aplicativo ASP.NET Core, é desnecessário para um aplicativo de Serviços do Windows. Para desativar a criação do arquivo web.config, adicione a propriedade <IsTransformWebConfigDisabled>
definida como true
.
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Implementação autónoma (SCD)
A implantação autônoma (SCD) não depende da presença de uma estrutura compartilhada no sistema host. O tempo de execução e as dependências do aplicativo são implantados com o aplicativo.
Um do Identificador do Tempo de Execução do Windows
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
Para publicar em vários RIDs:
- Forneça os RIDs em uma lista delimitada por ponto-e-vírgula.
- Utilize o nome da propriedade RuntimeIdentifiers <> (plural).
Para obter mais informações, consulte Catálogo de RID do .NET Core.
Conta de usuário do serviço
Para criar uma conta de usuário para um serviço, use o cmdlet New-LocalUser de um shell de comando administrativo do PowerShell 6.
No Windows 10 October 2018 Update (versão 1809/build 10.0.17763) ou posterior:
New-LocalUser -Name {SERVICE NAME}
No sistema operacional Windows anterior à Atualização de outubro de 2018 do Windows 10 (versão 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Forneça uma senha forte quando solicitado.
A menos que o parâmetro -AccountExpires
seja fornecido ao cmdlet New-LocalUser com uma expiração DateTime, a conta não expira.
Para obter mais informações, consulte Microsoft.PowerShell.LocalAccounts e Service User Accounts.
Uma abordagem alternativa para gerenciar usuários ao usar o Ative Directory é usar Contas de Serviço Gerenciado. Para obter mais informações, consulte a Visão Geral de Contas de Serviço Gerido de Grupo .
Direitos de início de sessão como serviço
Para estabelecer Iniciar sessão como um serviço direitos para uma conta de utilizador de serviço:
- Abra o editor de Diretiva de Segurança Local executando secpol.msc.
- Expanda o nó Políticas Locais e selecione Atribuição de Direitos de Utilizador.
- Abra a política Fazer logon como serviço.
- Selecione Adicionar usuário ou grupo.
- Forneça o nome do objeto (conta de usuário) usando uma das seguintes abordagens:
- Digite a conta de usuário (
{DOMAIN OR COMPUTER NAME\USER}
) no campo de nome do objeto e selecione OK para adicionar o usuário à política. - Selecione Avançado . Selecione Localizar agora. Selecione a conta de usuário na lista. Selecione OK. Selecione OK novamente para adicionar o usuário à política.
- Digite a conta de usuário (
- Selecione OK ou Aplicar para aceitar as alterações.
Criar e gerenciar o Serviço do Windows
Criar um serviço
Use comandos do PowerShell para registrar um serviço. Em um shell de comando administrativo do PowerShell 6, execute os seguintes comandos:
$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} --contentRoot {EXE FOLDER PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
-
{EXE PATH}
: Caminho do executável do aplicativo no host (por exemplo,d:\myservice
). Não inclua o nome do arquivo executável do aplicativo no caminho. Não é necessária uma barra final. -
{DOMAIN OR COMPUTER NAME\USER}
: Conta de usuário do serviço (por exemplo,Contoso\ServiceUser
). -
{SERVICE NAME}
: Nome do serviço (por exemplo,MyService
). -
{EXE FILE PATH}
: O caminho executável completo do aplicativo (por exemplo,d:\myservice\myservice.exe
). Inclua o nome do arquivo do executável com a extensão. -
{EXE FOLDER PATH}
: O caminho completo da pasta executável do aplicativo (por exemplo,d:\myservice
). -
{DESCRIPTION}
: Descrição do serviço (por exemplo,My sample service
). -
{DISPLAY NAME}
: Nome de exibição do serviço (por exemplo,My Service
).
Iniciar um serviço
Inicie um serviço com o seguinte comando do PowerShell 6:
Start-Service -Name {SERVICE NAME}
O comando leva alguns segundos para iniciar o serviço.
Determinar o status de um serviço
Para verificar o status de um serviço, use o seguinte comando do PowerShell 6:
Get-Service -Name {SERVICE NAME}
O status é relatado como um dos seguintes valores:
Starting
Running
Stopping
Stopped
Interromper um serviço
Pare um serviço com o seguinte comando do PowerShell 6:
Stop-Service -Name {SERVICE NAME}
Remover um serviço
Após um pequeno atraso para interromper um serviço, remova um serviço com o seguinte comando do PowerShell 6:
Remove-Service -Name {SERVICE NAME}
Cenários de servidor proxy e balanceador de carga
Serviços que interagem com solicitações da Internet ou de uma rede corporativa e estão atrás de um proxy ou balanceador de carga podem exigir configuração adicional. Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Configurar pontos de extremidade
Por padrão, ASP.NET Core se liga a http://localhost:5000
. Configure a URL e a porta definindo a variável de ambiente ASPNETCORE_URLS
.
Para abordagens adicionais de configuração de URL e porta, consulte o artigo do servidor relevante:
- Configurar endpoints para o servidor web ASP.NET Core Kestrel
- HTTP.sys implementação de servidor web no ASP.NET Core
As orientações anteriores abrangem o suporte a endpoints HTTPS. Por exemplo, configure o aplicativo para HTTPS quando a autenticação for usada com um Serviço do Windows.
Observação
O uso do certificado de desenvolvimento HTTPS do ASP.NET Core para proteger um ponto de extremidade de serviço não é suportado.
Diretório atual e raiz de conteúdo
O diretório de trabalho atual retornado chamando
Usar ContentRootPath ou ContentRootFileProvider
Use ou ContentRootFileProvider IHostEnvironment.ContentRootPath para localizar os recursos de um aplicativo.
Quando o aplicativo é executado como um serviço, UseWindowsService define o ContentRootPath como AppContext.BaseDirectory.
Os arquivos de configurações padrão do aplicativo, appsettings.json
e appsettings.{Environment}.json
, são carregados da raiz de conteúdo do aplicativo chamando CreateDefaultBuilder durante a construção do host.
Para outros ficheiros de configuração carregados pelo código do programador no ConfigureAppConfiguration, não há necessidade de chamar SetBasePath. No exemplo a seguir, o arquivo custom_settings.json
existe na raiz de conteúdo do aplicativo e é carregado sem definir explicitamente um caminho base:
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>();
});
}
Não tente usar
Armazene os arquivos de um serviço em um local adequado no disco
Especifique um caminho absoluto com SetBasePath ao usar um IConfigurationBuilder para a pasta que contém os arquivos.
Solução de problemas
Para solucionar problemas de um aplicativo de serviço Windows, consulte Solucionar problemas e depurar projetos ASP.NET Core.
Erros comuns
- Uma versão antiga ou de pré-lançamento do PowerShell está em uso.
- O serviço registrado não usa o publicado do aplicativo saída do comando dotnet publish. A saída do comando dotnet build não é suportada para a implantação da aplicação. Os ativos publicados são encontrados em uma das seguintes pastas, dependendo do tipo de implantação:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- O serviço não está no estado RUNNING.
- Os caminhos para recursos que o aplicativo usa (por exemplo, certificados) estão incorretos. O caminho base de um serviço do Windows é c:\Windows\System32.
- O usuário não tem Fazer logon como um serviço direitos.
- A senha do usuário expirou ou foi passada incorretamente ao executar o comando
New-Service
PowerShell. - O aplicativo requer autenticação ASP.NET Core, mas não está configurado para conexões seguras (HTTPS).
- A porta URL da solicitação está incorreta ou não está configurada corretamente no aplicativo.
Logs de eventos do sistema e do aplicativo
Acesse os logs de eventos do sistema e do aplicativo:
- Abra o menu Iniciar, procure o Visualizador de Eventose selecione a aplicação Visualizador de Eventos.
- Em Visualizador de Eventos, abra o nó Logs do Windows.
- Selecione Sistema para abrir o registo de eventos do sistema. Selecione Aplicação para abrir o Log de Eventos da Aplicação.
- Procure pelos erros associados à aplicação com falha.
Execute o aplicativo em um prompt de comando
Muitos erros de inicialização não produzem informações úteis nos logs de eventos. Você pode encontrar a causa de alguns erros executando o aplicativo em um prompt de comando no sistema de hospedagem. Para registrar detalhes adicionais do aplicativo, diminua o nível de log ou execute o aplicativo no ambiente de desenvolvimento .
Limpar caches de pacotes
Um aplicativo em funcionamento pode falhar imediatamente após atualizar o SDK do .NET Core na máquina de desenvolvimento ou alterar as versões do pacote no aplicativo. Em alguns casos, pacotes incoerentes podem quebrar um aplicativo ao executar grandes atualizações. A maioria desses problemas pode ser corrigida seguindo estas instruções:
Apague as pastas do compartimento e obj .
Limpe os caches do pacote executando dotnet nuget locals all --clear a partir de um shell de comando.
A limpeza de caches de pacotes também pode ser realizada com a ferramenta nuget.exe e executando o comando
nuget locals all -clear
. nuget.exe não é uma instalação integrada com o sistema operacional de desktop Windows e deve ser obtida separadamente do site NuGet.Restaure e reconstrua o projeto.
Exclua todos os arquivos na pasta de implantação no servidor antes de reimplantar o aplicativo.
Aplicação lenta ou sem resposta
Um despejo de memória é um instantâneo da memória do sistema e pode ajudar a determinar a causa de uma falha de aplicação, falha de inicialização ou aplicação lenta.
O aplicativo falha ou encontra uma exceção
Obtenha e analise um despejo de memória de Relatório de Erros do Windows (WER) :
Crie uma pasta para armazenar arquivos de despejo de memória em
c:\dumps
.Execute o script EnableDumps PowerShell com o nome executável do aplicativo:
.\EnableDumps {APPLICATION EXE} c:\dumps
Execute o aplicativo nas condições que causam a falha.
Depois que a falha tiver ocorrido, execute o script DisableDumps PowerShell:
.\DisableDumps {APPLICATION EXE}
Depois que um aplicativo falha e a coleta de despejo é concluída, o aplicativo pode ser encerrado normalmente. O script do PowerShell configura o WER para coletar até cinco despejos por aplicativo.
Advertência
Os despejos de memória podem ocupar uma grande quantidade de espaço em disco (até vários gigabytes cada).
O aplicativo não responde, falha durante a inicialização ou é executado normalmente
Quando um aplicativo para de responder, mas não falha, falha durante a inicialização ou funciona normalmente, consulte User-Mode Arquivos de despejo: Escolhendo a melhor ferramenta para selecionar uma ferramenta apropriada para produzir o despejo.
Analise o despejo
Um despejo pode ser analisado usando várias abordagens. Para obter mais informações, consulte Analisando um ficheiro de despejo User-Mode.
Recursos adicionais
- Visualizar ou baixar código de exemplo (como fazer download)
- Configuração de endpointKestrel (inclui configuração de HTTPS e suporte a SNI)
- Host Genérico do .NET no ASP.NET Core
- Solucionar problemas e depurar ASP.NET projetos principais
Uma aplicação ASP.NET Core pode ser hospedada no Windows como um Serviço do Windows sem usar o IIS. Quando hospedado como um serviço do Windows, o aplicativo é iniciado automaticamente após a reinicialização do servidor.
Ver ou baixar código de exemplo (como descarregar)
Pré-requisitos
Modelo de Serviço do Trabalhador
O modelo ASP.NET Core Worker Service fornece um ponto de partida para escrever aplicativos de serviço de longa execução. Para usar o modelo como base para um aplicativo de serviço do Windows:
- Crie um aplicativo do Serviço de Trabalho a partir do modelo .NET Core.
- Siga as orientações na seção de configuração do Aplicativo
para atualizar o aplicativo Serviço de Trabalho para que ele possa ser executado como um Serviço do Windows.
- Visual Studio
- Visual Studio para Mac
- da CLI do .NET
- Crie um novo projeto.
- Selecione Worker Service. Selecione Avançar.
- Forneça um nome de projeto no campo Nome do projeto ou aceite o nome do projeto padrão. Selecione Criar.
- Na caixa de diálogo Criar um novo serviço de trabalho, selecione Criar.
Configuração do aplicativo
O aplicativo requer uma referência de pacote para Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
é chamado quando se constrói o host. Se o aplicativo estiver sendo executado como um serviço do Windows, o método:
- Define o tempo de vida do host como
WindowsServiceLifetime
. - Define o raiz de conteúdo
como AppContext.BaseDirectory . Para obter mais informações, consulte a seção diretório atual e raiz do conteúdo. - Permite o registo no log de eventos:
- O nome do aplicativo é usado como o nome de origem padrão.
- O nível padrão de log é de Aviso ou superior para um aplicativo baseado num modelo ASP.NET Core que chama
CreateDefaultBuilder
para construir o host. - Substitua o nível de log padrão pela chave
Logging:EventLog:LogLevel:Default
emappsettings.json
/appsettings.{Environment}.json
ou noutro provedor de configuração. - Apenas os administradores podem criar novas fontes de eventos. Quando uma fonte de eventos não pode ser criada usando o nome da aplicação, um aviso é registado na fonte de aplicativo e os registos de eventos são desativados.
Em Program.cs
:
- Definir
ContentRootPath
- Ligue para
UseWindowsService
using Microsoft.Extensions.Hosting.WindowsServices;
using SampleApp.Services;
var options = new WebApplicationOptions
{
Args = args,
ContentRootPath = WindowsServiceHelpers.IsWindowsService()
? AppContext.BaseDirectory : default
};
var builder = WebApplication.CreateBuilder(options);
builder.Services.AddRazorPages();
builder.Services.AddHostedService<ServiceA>();
builder.Services.AddHostedService<ServiceB>();
builder.Host.UseWindowsService();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
await app.RunAsync();
Os seguintes aplicativos de exemplo acompanham este tópico:
- Este é um exemplo de Serviço de Trabalho em Segundo Plano: uma aplicação não web baseada no modelo de Serviço de Trabalho que utiliza serviços alojados para tarefas em segundo plano.
- Exemplo de Serviço de Aplicação Web: um exemplo de aplicação web de Páginas Razor que é executada como um Serviço do Windows com serviços hospedados para tarefas em segundo plano.
Para obter orientação sobre MVC, consulte os artigos em Visão geral do ASP.NET Core MVC e Migrar do ASP.NET Core 2.2 para 3.0 .
Tipo de implantação
Para obter informações e conselhos sobre cenários de implantação, consulte de implantação de aplicativos .NET Core .
SDK
Para um serviço baseado em aplicativo Web que usa as estruturas Razor Pages ou MVC, especifique o SDK da Web no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Web">
Se o serviço executar apenas tarefas em segundo plano (por exemplo, serviços hospedados), especifique o SDK do trabalhador no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Implantação dependente da estrutura (FDD)
A implantação dependente da estrutura (FDD) depende da presença de uma versão compartilhada do .NET Core em todo o sistema no sistema de destino. Quando o cenário FDD é adotado seguindo as orientações deste artigo, o SDK produz um executável (.exe), conhecido como um executável dependente de framework .
Se estiver usando o Web SDK, um arquivo web.config, que normalmente é produzido ao publicar um aplicativo ASP.NET Core, é desnecessário para um aplicativo de Serviços do Windows. Para desativar a criação do arquivo web.config, adicione a propriedade <IsTransformWebConfigDisabled>
definida como true
.
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Implantação autónoma (SCD)
A implantação autônoma (SCD) não depende da presença de uma estrutura compartilhada no sistema host. O tempo de execução e as dependências do aplicativo são implantados com o aplicativo.
Um do Identificador do Tempo de Execução do Windows
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Para publicar em vários RIDs:
- Forneça os RIDs em uma lista delimitada por ponto-e-vírgula.
- Use o nome da propriedade <Identificadores de Execução> (plural).
Para obter mais informações, consulte Catálogo de RID do .NET Core.
Conta de usuário do serviço
Para criar uma conta de usuário para um serviço, use o cmdlet New-LocalUser de um shell de comando administrativo do PowerShell 6.
No Windows 10 October 2018 Update (versão 1809/build 10.0.17763) ou posterior:
New-LocalUser -Name {SERVICE NAME}
No sistema operacional Windows anterior à Atualização de outubro de 2018 do Windows 10 (versão 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Forneça uma senha forte quando solicitado.
A menos que o parâmetro -AccountExpires
seja fornecido ao cmdlet New-LocalUser com uma expiração DateTime, a conta não expira.
Para obter mais informações, consulte Microsoft.PowerShell.LocalAccounts e Service User Accounts.
Uma abordagem alternativa para gerenciar usuários ao usar o Ative Directory é usar Contas de Serviço Gerenciado. Para obter mais informações, consulte Contas de Serviço Geridas de Grupo: Visão Geral.
Direitos de iniciar sessão como serviço
Para estabelecer Iniciar sessão como um serviço permissões para uma conta de utilizador de serviço:
- Abra o editor de Diretiva de Segurança Local executando secpol.msc.
- Expanda o nó
Políticas Locais e selecione de Atribuição de Direitos de Usuário . - Abra a política Fazer logon como serviço.
- Selecione Adicionar usuário ou grupo.
- Forneça o nome do objeto (conta de usuário) usando uma das seguintes abordagens:
- Digite a conta de usuário (
{DOMAIN OR COMPUTER NAME\USER}
) no campo de nome do objeto e selecione OK para adicionar o usuário à política. - Selecione Avançado . Selecione Localizar agora. Selecione a conta de usuário na lista. Selecione OK. Selecione OK novamente para adicionar o usuário à política.
- Digite a conta de usuário (
- Selecione OK ou Aplicar para aceitar as alterações.
Criar e gerenciar o Serviço do Windows
Criar um serviço
Use comandos do PowerShell para registrar um serviço. Em um shell de comando administrativo do PowerShell 6, execute os seguintes comandos:
$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} --contentRoot {EXE FOLDER PATH}" -Credential "{DOMAIN OR COMPUTER NAME\USER}" -Description "{DESCRIPTION}" -DisplayName "{DISPLAY NAME}" -StartupType Automatic
-
{EXE PATH}
: Caminho do executável do aplicativo no host (por exemplo,d:\myservice
). Não inclua o nome do arquivo executável do aplicativo no caminho. Não é necessária uma barra final. -
{DOMAIN OR COMPUTER NAME\USER}
: Conta de usuário do serviço (por exemplo,Contoso\ServiceUser
). -
{SERVICE NAME}
: Nome do serviço (por exemplo,MyService
). -
{EXE FILE PATH}
: O caminho executável completo do aplicativo (por exemplo,d:\myservice\myservice.exe
). Inclua o nome do arquivo do executável com a extensão. -
{EXE FOLDER PATH}
: O caminho completo da pasta executável do aplicativo (por exemplo,d:\myservice
). -
{DESCRIPTION}
: Descrição do serviço (por exemplo,My sample service
). -
{DISPLAY NAME}
: Nome de exibição do serviço (por exemplo,My Service
).
Iniciar um serviço
Inicie um serviço com o seguinte comando do PowerShell 6:
Start-Service -Name {SERVICE NAME}
O comando leva alguns segundos para iniciar o serviço.
Determinar o status de um serviço
Para verificar o status de um serviço, use o seguinte comando do PowerShell 6:
Get-Service -Name {SERVICE NAME}
O status é relatado como um dos seguintes valores:
Starting
Running
Stopping
Stopped
Interromper um serviço
Pare um serviço com o seguinte comando do PowerShell 6:
Stop-Service -Name {SERVICE NAME}
Remover um serviço
Após um pequeno atraso para interromper um serviço, remova um serviço com o seguinte comando do PowerShell 6:
Remove-Service -Name {SERVICE NAME}
Cenários de servidor proxy e balanceador de carga
Serviços que interagem com solicitações da Internet ou de uma rede corporativa e estão atrás de um proxy ou balanceador de carga podem exigir configuração adicional. Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Configurar pontos de extremidade
Por padrão, ASP.NET Core se liga a http://localhost:5000
. Configure a URL e a porta definindo a variável de ambiente ASPNETCORE_URLS
.
Para abordagens adicionais de configuração de URL e porta, consulte o artigo do servidor relevante:
- Configurar pontos de extremidade para o servidor Web ASP.NET Core Kestrel
- HTTP.sys implementação de servidor web no ASP.NET Core
As orientações precedentes abrangem o suporte para endpoints HTTPS. Por exemplo, configure o aplicativo para HTTPS quando a autenticação for usada com um Serviço do Windows.
Observação
Não é suportado o uso do certificado de desenvolvimento HTTPS ASP.NET Core para proteger um endpoint de serviço.
Diretório atual e raiz de conteúdo
O diretório de trabalho atual retornado chamando
Usar ContentRootPath ou ContentRootFileProvider
Use ou ContentRootFileProvider IHostEnvironment.ContentRootPath para localizar os recursos de um aplicativo.
Quando o aplicativo é executado como um serviço, UseWindowsService define o ContentRootPath como AppContext.BaseDirectory.
Os ficheiros de configurações padrão da aplicação, appsettings.json
e appsettings.{Environment}.json
, são carregados da raiz de conteúdo da aplicação ao chamar CreateDefaultBuilder durante o processo de construção do servidor.
Para outros arquivos de definições carregados pelo código do desenvolvedor no ConfigureAppConfiguration, não é necessário chamar SetBasePath. No exemplo a seguir, o arquivo custom_settings.json
existe na raiz de conteúdo do aplicativo e é carregado sem definir explicitamente um caminho base:
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>();
});
}
Não tente usar
Armazene os arquivos de um serviço em um local adequado no disco
Especifique um caminho absoluto com SetBasePath ao usar um IConfigurationBuilder para a pasta que contém os arquivos.
Solução de problemas
Para resolver problemas de um aplicativo de Serviço do Windows, consulte Resolver problemas e depurar projetos do ASP.NET Core.
Erros comuns
- Uma versão antiga ou de pré-lançamento do PowerShell está em uso.
- O serviço registrado não usa o publicado do aplicativo saída do comando dotnet publish. A saída do comando dotnet build não é suportada para a implantação da aplicação. Os ativos publicados são encontrados em uma das seguintes pastas, dependendo do tipo de implantação:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- O serviço não está no estado em execução.
- Os caminhos para recursos que o aplicativo usa (por exemplo, certificados) estão incorretos. O caminho base de um serviço do Windows é c:\Windows\System32.
- O usuário não tem Fazer logon como um serviço direitos.
- A senha do usuário expirou ou foi passada incorretamente ao executar o comando
New-Service
PowerShell. - O aplicativo requer autenticação ASP.NET Core, mas não está configurado para conexões seguras (HTTPS).
- A porta URL da solicitação está incorreta ou não está configurada corretamente no aplicativo.
Logs de eventos do sistema e do aplicativo
Acesse os logs de eventos do sistema e do aplicativo:
- Abra o menu Iniciar, procure por Visualizador de Eventose selecione o aplicativo Visualizador de Eventos.
- Em Visualizador de Eventos, abra o nó Windows Logs.
- Selecione Sistema para abrir o log de eventos do sistema. Selecione Aplicação para abrir o Registo de Eventos da Aplicação.
- Procure erros associados à aplicação que está falhando.
Execute o aplicativo em um prompt de comando
Muitos erros de inicialização não produzem informações úteis nos logs de eventos. Você pode encontrar a causa de alguns erros executando o aplicativo em um prompt de comando no sistema de hospedagem. Para registrar detalhes adicionais do aplicativo, diminua o nível de log ou execute o aplicativo no ambiente de desenvolvimento .
Limpar caches de pacotes
Um aplicativo em funcionamento pode falhar imediatamente após atualizar o SDK do .NET Core na máquina de desenvolvimento ou alterar as versões do pacote no aplicativo. Em alguns casos, pacotes incoerentes podem quebrar um aplicativo ao executar grandes atualizações. A maioria desses problemas pode ser corrigida seguindo estas instruções:
Eliminar os compartimentos
e e.e as pastas obj Limpe os cachês dos pacotes executando dotnet nuget locals all --clear a partir de um shell de comandos.
A limpeza de caches de pacotes também pode ser realizada com a ferramenta nuget.exe e executando o comando
nuget locals all -clear
. nuget.exe não é uma instalação integrada com o sistema operacional de desktop Windows e deve ser obtida separadamente do site NuGet.Restaure e reconstrua o projeto.
Exclua todos os arquivos na pasta de implantação no servidor antes de reimplantar o aplicativo.
Aplicação lenta ou sem resposta
Um despejo de memória é um instantâneo da memória do sistema e pode ajudar a determinar a causa de um crash de aplicação, falha de inicialização ou aplicação lenta.
O aplicativo falha ou encontra uma exceção
Obtenha e analise um dump do Relatório de Erros do Windows (WER) :
Crie uma pasta para armazenar arquivos de despejo de memória em
c:\dumps
.Execute o script EnableDumps PowerShell com o nome executável do aplicativo:
.\EnableDumps {APPLICATION EXE} c:\dumps
Execute o aplicativo nas condições que causam a falha.
Depois de a falha ocorrer, execute o script DisableDumps PowerShell:
.\DisableDumps {APPLICATION EXE}
Depois que um aplicativo falha e a coleta de despejo é concluída, o aplicativo pode ser encerrado normalmente. O script do PowerShell configura o WER para coletar até cinco despejos por aplicativo.
Advertência
Os despejos de memória podem consumir uma grande quantidade de espaço em disco (até vários gigabytes cada).
O aplicativo não responde, falha durante a inicialização ou é executado normalmente
Quando uma aplicação deixa de responder, mas não falha, falha durante a inicialização ou funciona normalmente, consulte os User-Mode Arquivos de Despejo: Escolhendo a Melhor Ferramenta para escolher a ferramenta apropriada e produzir o dump.
Analise o despejo
Um despejo pode ser analisado usando várias abordagens. Para obter mais informações, consulte Analisando um ficheiro de despejode User-Mode.
Recursos adicionais
- Kestrel configuração do endpoint (inclui configuração HTTPS e suporte SNI)
- Host Genérico do .NET no ASP.NET Core
- Solucionar e depurar projetos ASP.NET Core
Uma aplicação ASP.NET Core pode ser hospedada no Windows como um serviço do Windows sem usar o IIS. Quando hospedado como um serviço do Windows, o aplicativo é iniciado automaticamente após a reinicialização do servidor.
Exibir ou baixar código de exemplo (como baixar)
Pré-requisitos
Modelo de Serviço do Trabalhador
O modelo ASP.NET Core Worker Service fornece um ponto de partida para escrever aplicativos de serviço de longa execução. Para usar o modelo como base para um aplicativo de serviço do Windows:
- Crie um aplicativo do Serviço de Trabalho a partir do modelo .NET Core.
- Siga as orientações na seção de configuração do Aplicativo
para atualizar o aplicativo Serviço de Trabalho para que ele possa ser executado como um Serviço do Windows.
- Visual Studio
- Visual Studio para Mac
- da CLI do .NET
- Crie um novo projeto.
- Selecione Worker Service. Selecione Avançar.
- Forneça um nome de projeto no campo Nome do projeto ou aceite o nome do projeto padrão. Selecione Criar.
- Na caixa de diálogo Criar um novo serviço de trabalho, selecione Criar.
Configuração do aplicativo
O aplicativo requer uma referência de pacote para Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
é chamado ao construir o host. Se o aplicativo estiver sendo executado como um serviço do Windows, o método:
- Define o tempo de vida do host como
WindowsServiceLifetime
. - Define o raiz de conteúdo para AppContext.BaseDirectory. Para obter mais informações, consulte a seção diretório atual e raiz do conteúdo.
- Permite o registo no registo de ocorrências:
- O nome do aplicativo é usado como o nome de origem padrão.
- O padrão de nível de registo é Aviso ou superior para uma aplicação baseada num modelo ASP.NET Core que utiliza
CreateDefaultBuilder
para construir o host. - Substitua o nível de log predefinido pela chave
Logging:EventLog:LogLevel:Default
emappsettings.json
/appsettings.{Environment}.json
ou outro fornecedor de configuração. - Apenas os administradores podem criar novas fontes de eventos. Quando uma fonte de eventos não pode ser criada usando o nome do aplicativo, um aviso é registrado no a origem do Application e os logs de eventos são desabilitados.
Em CreateHostBuilder
de Program.cs
:
Host.CreateDefaultBuilder(args)
.UseWindowsService()
...
Os seguintes aplicativos de exemplo acompanham este tópico:
- Exemplo de Serviço de Trabalhador em Segundo Plano: um exemplo de aplicativo não Web baseado no modelo Serviço de Trabalhador que usa de serviços hospedados para tarefas em segundo plano.
- Exemplo de Serviço de Aplicação Web: um exemplo de aplicação de páginas web Razor que é executado como um serviço do Windows com serviços hospedados para tarefas em segundo plano.
Para obter orientação sobre MVC, consulte os artigos em Visão geral do ASP.NET Core MVC e Migrar do ASP.NET Core 2.2 para o 3.0.
Tipo de implantação
Para obter informações e conselhos sobre cenários de implantação, consulte implantação de aplicativos .NET Core.
SDK
Para um serviço baseado em aplicativo Web que usa as estruturas Razor Pages ou MVC, especifique o SDK da Web no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Web">
Se o serviço executar apenas tarefas em segundo plano (por exemplo, serviços hospedados), especifique o SDK de Worker no arquivo de projeto.
<Project Sdk="Microsoft.NET.Sdk.Worker">
Implantação dependente da estrutura (FDD)
A implementação dependente de framework (FDD) depende da presença de uma versão partilhada do .NET Core no sistema de destino. Quando o cenário FDD é adotado seguindo as orientações deste artigo, o SDK produz um executável (
Se estiver usando o Web SDK, um arquivo web.config, que normalmente é produzido ao publicar um aplicativo ASP.NET Core, é desnecessário para um aplicativo de Serviços do Windows. Para desativar a criação do arquivo web.config, adicione a propriedade <IsTransformWebConfigDisabled>
definida como true
.
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Implantação autónoma (SCD)
A implantação autônoma (SCD) não depende da presença de uma estrutura compartilhada no sistema host. O tempo de execução e as dependências do aplicativo são implantados com o aplicativo.
Um Identificador do Tempo de Execução do Windows (RID) está incluído no <PropertyGroup>
que contém a estrutura-alvo:
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Para publicar em múltiplos RIDs:
- Forneça os RIDs em uma lista delimitada por ponto-e-vírgula.
- Use o nome da propriedade <RuntimeIdentifiers> (plural).
Para obter mais informações, consulte Catálogo de RID do .NET Core.
Conta de usuário do serviço
Para criar uma conta de usuário para um serviço, use o cmdlet New-LocalUser de um shell de comando administrativo do PowerShell 6.
No Windows 10 October 2018 Update (versão 1809/build 10.0.17763) ou posterior:
New-LocalUser -Name {SERVICE NAME}
No sistema operacional Windows anterior à Atualização de outubro de 2018 do Windows 10 (versão 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Forneça uma senha forte quando solicitado.
A menos que o parâmetro -AccountExpires
seja fornecido ao cmdlet New-LocalUser com uma expiração DateTime, a conta não expira.
Para obter mais informações, consulte Microsoft.PowerShell.LocalAccounts e Service User Accounts.
Uma abordagem alternativa para gerenciar usuários ao usar o Ative Directory é usar Contas de Serviço Gerenciado. Para obter mais informações, consulte as contas de serviço geridas de grupo \Visão geral \.
Direitos de início de sessão como serviço
Para estabelecer Fazer logon como um serviço direitos para uma conta de usuário de serviço:
- Abra o editor de Diretiva de Segurança Local executando secpol.msc.
- Expanda o nó Políticas Locais e selecione Atribuição de Direitos de Utilizador .
- Abra a política Fazer logon como serviço.
- Selecione Adicionar usuário ou grupo.
- Forneça o nome do objeto (conta de usuário) usando uma das seguintes abordagens:
- Digite a conta de usuário (
{DOMAIN OR COMPUTER NAME\USER}
) no campo de nome do objeto e selecione OK para adicionar o usuário à política. - Selecione Avançado . Selecione Localizar agora. Selecione a conta de usuário na lista. Selecione OK. Selecione OK novamente para adicionar o usuário à política.
- Digite a conta de usuário (
- Selecione OK ou Aplicar para aceitar as alterações.
Criar e gerenciar o Serviço do Windows
Criar um serviço
Use comandos do PowerShell para registrar um serviço. Em um shell de comando administrativo do PowerShell 6, execute os seguintes comandos:
$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}
: Caminho do executável do aplicativo no host (por exemplo,d:\myservice
). Não inclua o nome do arquivo executável do aplicativo no caminho. Não é necessária uma barra no final. -
{DOMAIN OR COMPUTER NAME\USER}
: Conta de usuário do serviço (por exemplo,Contoso\ServiceUser
). -
{SERVICE NAME}
: Nome do serviço (por exemplo,MyService
). -
{EXE FILE PATH}
: O caminho executável completo do aplicativo (por exemplo,d:\myservice\myservice.exe
). Inclua o nome do arquivo do executável com a extensão. -
{DESCRIPTION}
: Descrição do serviço (por exemplo,My sample service
). -
{DISPLAY NAME}
: Nome de exibição do serviço (por exemplo,My Service
).
Iniciar um serviço
Inicie um serviço com o seguinte comando do PowerShell 6:
Start-Service -Name {SERVICE NAME}
O comando leva alguns segundos para iniciar o serviço.
Determinar o status de um serviço
Para verificar o status de um serviço, use o seguinte comando do PowerShell 6:
Get-Service -Name {SERVICE NAME}
O status é relatado como um dos seguintes valores:
Starting
Running
Stopping
Stopped
Parar um serviço
Pare um serviço com o seguinte comando do PowerShell 6:
Stop-Service -Name {SERVICE NAME}
Remover um serviço
Após um pequeno atraso para interromper um serviço, remova um serviço com o seguinte comando do PowerShell 6:
Remove-Service -Name {SERVICE NAME}
Cenários de servidor proxy e balanceador de carga
Serviços que interagem com solicitações da Internet ou de uma rede corporativa e estão atrás de um proxy ou balanceador de carga podem exigir configuração adicional. Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Configurar pontos de extremidade
Por padrão, ASP.NET Core se liga a http://localhost:5000
. Configure a URL e a porta definindo a variável de ambiente ASPNETCORE_URLS
.
Para abordagens adicionais de configuração de URL e porta, consulte o artigo do servidor relevante:
- Configurar pontos de extremidade para o servidor web ASP.NET Core Kestrel
- HTTP.sys implementação de servidor web no ASP.NET Core
As orientações anteriores abrangem o suporte para endpoints HTTPS. Por exemplo, configure o aplicativo para HTTPS quando a autenticação for usada com um Serviço do Windows.
Observação
Não há suporte para o uso do certificado de desenvolvimento HTTPS ASP.NET Core para proteger um ponto de extremidade de serviço.
Diretório atual e raiz de conteúdo
O diretório de trabalho atual retornado chamando
Utilize ContentRootPath ou ContentRootFileProvider
Use ou ContentRootFileProvider IHostEnvironment.ContentRootPath para localizar os recursos de um aplicativo.
Quando o aplicativo é executado como um serviço, UseWindowsService define o ContentRootPath como AppContext.BaseDirectory.
Os arquivos de configurações padrão do aplicativo, appsettings.json
e appsettings.{Environment}.json
, são carregados da raiz de conteúdo do aplicativo ao chamar CreateDefaultBuilder durante a construção do host.
Para outros ficheiros de configuração carregados pelo código do desenvolvedor no ConfigureAppConfiguration, não há necessidade de chamar SetBasePath. No exemplo a seguir, o arquivo custom_settings.json
existe na raiz de conteúdo do aplicativo e é carregado sem definir explicitamente um caminho base:
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>();
});
}
Não tente usar
Armazene os arquivos de um serviço em um local adequado no disco
Especifique um caminho absoluto com SetBasePath ao usar um IConfigurationBuilder para a pasta que contém os arquivos.
Resolver problemas
Para solucionar problemas de um aplicativo de Serviço do Windows, consulte Solucionar problemas e depurar projetos do ASP.NET Core.
Erros comuns
- Uma versão antiga ou de pré-lançamento do PowerShell está em uso.
- O serviço registrado não usa o publicado do aplicativo saída do comando dotnet publish. A saída do comando dotnet build não é suportada para a distribuição da aplicação. Os ativos publicados são encontrados em uma das seguintes pastas, dependendo do tipo de implantação:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- O serviço não está no estado de execução.
- Os caminhos para recursos que o aplicativo usa (por exemplo, certificados) estão incorretos. O caminho base de um serviço do Windows é c:\Windows\System32.
- O utilizador não tem direitos de Iniciar sessão como um serviço.
- A senha do usuário expirou ou foi passada incorretamente ao executar o comando
New-Service
PowerShell. - O aplicativo requer autenticação ASP.NET Core, mas não está configurado para conexões seguras (HTTPS).
- A porta URL da solicitação está incorreta ou não está configurada corretamente no aplicativo.
Logs de eventos do sistema e do aplicativo
Acesse os logs de eventos do sistema e do aplicativo:
- Abra o menu Iniciar, procure Visualizador de Eventose selecione o aplicativo Visualizador de Eventos.
- No Visualizador de Eventos , abra o nó Logs do Windows .
- Selecione Sistema para abrir o Log de Eventos do Sistema. Selecione Aplicação para abrir o Registo de Eventos da Aplicação.
- Procure erros associados ao aplicativo com falha.
Execute o aplicativo em um prompt de comando
Muitos erros de inicialização não produzem informações úteis nos logs de eventos. Você pode encontrar a causa de alguns erros executando o aplicativo em um prompt de comando no sistema de hospedagem. Para registrar detalhes adicionais do aplicativo, diminua o nível de log ou execute o aplicativo no ambiente de desenvolvimento .
Limpar caches de pacotes
Um aplicativo em funcionamento pode falhar imediatamente após atualizar o SDK do .NET Core na máquina de desenvolvimento ou alterar as versões do pacote no aplicativo. Em alguns casos, pacotes incoerentes podem quebrar um aplicativo ao executar grandes atualizações. A maioria desses problemas pode ser corrigida seguindo estas instruções:
Exclua as pastas bin e obj.
Limpe os caches do pacote executando dotnet nuget locals all --clear de uma shell de comandos.
A limpeza de caches de pacotes também pode ser realizada com a ferramenta nuget.exe e executando o comando
nuget locals all -clear
. nuget.exe não é uma instalação integrada com o sistema operacional de desktop Windows e deve ser obtida separadamente do site NuGet.Restaure e reconstrua o projeto.
Exclua todos os arquivos na pasta de implantação no servidor antes de reimplantar o aplicativo.
Aplicação lenta ou sem resposta
Um despejo de memória é um instantâneo da memória do sistema e pode ajudar a determinar a causa de uma falha de aplicação, falha de inicialização ou aplicação lenta.
O aplicativo falha ou encontra uma exceção
Obtenha e analise um despejo do Relatório de Erros do Windows (WER) :
Crie uma pasta para armazenar arquivos de despejo de memória em
c:\dumps
.Execute o script EnableDumps PowerShell com o nome executável do aplicativo:
.\EnableDumps {APPLICATION EXE} c:\dumps
Execute o aplicativo nas condições que causam a falha.
Após a falha ter ocorrido, execute o script do PowerShell DisableDumps:
.\DisableDumps {APPLICATION EXE}
Depois que um aplicativo falha e a coleta de despejo é concluída, o aplicativo pode ser encerrado normalmente. O script do PowerShell configura o WER para coletar até cinco despejos por aplicativo.
Advertência
Os despejos de memória podem ocupar uma grande quantidade de espaço em disco (até vários gigabytes cada).
O aplicativo não responde, falha durante a inicialização ou é executado normalmente
Quando um aplicativo para de responder, mas não falha, falha durante a inicialização ou funciona de forma anormal, consulte User-Mode Arquivos de despejo: para escolher a melhor ferramenta para selecionar uma ferramenta apropriada para produzir o arquivo de despejo.
Analise o despejo
Um despejo pode ser analisado usando várias abordagens. Para obter mais informações, consulte Analisar um Ficheiro de Despejo User-Mode.
Recursos adicionais
- Kestrel de configuração de endpoint (inclui configuração HTTPS e suporte SNI)
- Host Genérico do .NET no ASP.NET Core
- Solucionar problemas e depurar projetos ASP.NET Core
Um aplicativo ASP.NET Core pode ser hospedado no Windows como um Serviço do Windows
Exibir ou baixar código de exemplo (como baixar)
Pré-requisitos
Modelo de Serviço do Trabalhador
O modelo ASP.NET Core Worker Service fornece um ponto de partida para escrever aplicativos de serviço de longa execução. Para usar o modelo como base para um aplicativo de serviço do Windows:
- Crie um aplicativo do Serviço de Trabalho a partir do modelo .NET Core.
- Siga as orientações na seção de configuração do Aplicativo
para atualizar o aplicativo Serviço de Trabalho para que ele possa ser executado como um Serviço do Windows.
- Visual Studio
- Visual Studio para Mac
- da CLI do .NET
- Crie um novo projeto.
- Selecione Worker Service. Selecione Avançar.
- Forneça um nome de projeto no campo Nome do projeto ou aceite o nome do projeto padrão. Selecione Criar.
- Na caixa de diálogo Criar um novo serviço de trabalho, selecione Criar.
Configuração do aplicativo
O aplicativo requer uma referência de pacote para Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
é chamado quando se constrói o host. Se o aplicativo estiver sendo executado como um serviço do Windows, o método:
- Define o tempo de vida do host como
WindowsServiceLifetime
. - Define o raiz de conteúdo
como AppContext.BaseDirectory . Para obter mais informações, consulte a seção diretório atual e raiz do conteúdo. - Permite o registo no diário de eventos:
- O nome do aplicativo é usado como o nome de origem padrão.
- O nível de log padrão é "Warning" ou superior para uma aplicação baseada num modelo ASP.NET Core que utiliza
CreateDefaultBuilder
para construir o host. - Substitua o nível de log padrão pela chave
Logging:EventLog:LogLevel:Default
noappsettings.json
/appsettings.{Environment}.json
ou em outro provedor de configuração. - Apenas os administradores podem criar novas fontes de eventos. Quando uma fonte de eventos não pode ser criada usando o nome do aplicativo, um aviso é registrado no a origem do Application e os logs de eventos são desabilitados.
Em CreateHostBuilder
de Program.cs
:
Host.CreateDefaultBuilder(args)
.UseWindowsService()
...
Os seguintes aplicativos de exemplo acompanham este tópico:
- Exemplo de Serviço de Trabalhador em Segundo Plano: um exemplo de aplicação não Web baseado no modelo de Serviço de Trabalhador que utiliza serviços hospedados para tarefas em segundo plano.
- Exemplo de Serviço de Aplicação Web: um exemplo de aplicação web Razor Páginas que é executado como um Serviço Windows com serviços hospedados para tarefas em plano de fundo.
Para obter orientação sobre MVC, consulte os artigos em Visão geral do ASP.NET Core MVC e Migrar do ASP.NET Core 2.2 para 3.0.
Tipo de implantação
Para obter informações e conselhos sobre cenários de implantação, consulte implantação de aplicativos .NET Core.
SDK
Para um serviço baseado em aplicativo Web que usa as estruturas Razor Pages ou MVC, especifique o SDK da Web no arquivo de projeto:
<Project Sdk="Microsoft.NET.Sdk.Web">
Se o serviço executar apenas tarefas em segundo plano (por exemplo, serviços hospedados), especifique o Worker SDK no arquivo de projeto.
<Project Sdk="Microsoft.NET.Sdk.Worker">
Implantação dependente da estrutura (FDD)
A implantação dependente da estrutura (FDD) depende da presença de uma versão compartilhada do .NET Core em todo o sistema no sistema de destino. Quando o cenário FDD é adotado seguindo as orientações deste artigo, o SDK produz um executável (
Se estiver usando o Web SDK, um arquivo web.config, que normalmente é produzido ao publicar um aplicativo ASP.NET Core, é desnecessário para um aplicativo de Serviços do Windows. Para desativar a criação do arquivo web.config, adicione a propriedade <IsTransformWebConfigDisabled>
definida como true
.
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Implantação autónoma (SCD)
A implantação autônoma (SCD) não depende da presença de uma estrutura compartilhada no sistema host. O ambiente de execução e as dependências da aplicação são implantados juntamente com ela.
Um do Identificador do Tempo de Execução do Windows
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Para publicar em vários RIDs:
- Forneça os RIDs em uma lista delimitada por ponto-e-vírgula.
- Use o nome da propriedade <RuntimeIdentifiers> (plural).
Para obter mais informações, consulte Catálogo de RID do .NET Core.
Conta de usuário do serviço
Para criar uma conta de usuário para um serviço, use o cmdlet New-LocalUser de um shell de comando administrativo do PowerShell 6.
No Windows 10 October 2018 Update (versão 1809/build 10.0.17763) ou posterior:
New-LocalUser -Name {SERVICE NAME}
No sistema operacional Windows anterior à Atualização de outubro de 2018 do Windows 10 (versão 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Forneça uma palavra-passe forte quando solicitado.
A menos que o parâmetro -AccountExpires
seja fornecido ao cmdlet New-LocalUser com uma expiração DateTime, a conta não expira.
Para obter mais informações, consulte Microsoft.PowerShell.LocalAccounts e Service User Accounts.
Uma abordagem alternativa para gerenciar usuários ao usar o Ative Directory é usar Contas de Serviço Gerenciado. Para mais informações, consulte a Visão geral das contas de serviço geridas de grupo .
Direitos de início de sessão como serviço
Para estabelecer Iniciar sessão como um serviço direitos para uma conta de utilizador do serviço:
- Abra o editor de Diretiva de Segurança Local executando secpol.msc.
- Expanda o nó Políticas Locais e selecione Atribuição de Direitos de Utilizador.
- Abra a política Iniciar sessão como serviço.
- Selecione Adicionar usuário ou grupo.
- Forneça o nome do objeto (conta de usuário) usando uma das seguintes abordagens:
- Digite a conta de usuário (
{DOMAIN OR COMPUTER NAME\USER}
) no campo de nome do objeto e selecione OK para adicionar o usuário à política. - Selecione Avançado . Selecione Localizar agora. Selecione a conta de usuário na lista. Selecione OK. Selecione OK novamente para adicionar o usuário à política.
- Digite a conta de usuário (
- Selecione OK ou Aplicar para aceitar as alterações.
Criar e gerenciar o Serviço do Windows
Criar um serviço
Use comandos do PowerShell para registrar um serviço. Em um shell de comando administrativo do PowerShell 6, execute os seguintes comandos:
$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}
: Caminho do executável do aplicativo no host (por exemplo,d:\myservice
). Não inclua o nome do arquivo executável do aplicativo no caminho. Não é necessária uma barra final. -
{DOMAIN OR COMPUTER NAME\USER}
: Conta de usuário do serviço (por exemplo,Contoso\ServiceUser
). -
{SERVICE NAME}
: Nome do serviço (por exemplo,MyService
). -
{EXE FILE PATH}
: O caminho executável completo do aplicativo (por exemplo,d:\myservice\myservice.exe
). Inclua o nome do arquivo do executável com a extensão. -
{DESCRIPTION}
: Descrição do serviço (por exemplo,My sample service
). -
{DISPLAY NAME}
: Nome de exibição do serviço (por exemplo,My Service
).
Iniciar um serviço
Inicie um serviço com o seguinte comando do PowerShell 6:
Start-Service -Name {SERVICE NAME}
O comando leva alguns segundos para iniciar o serviço.
Determinar o status de um serviço
Para verificar o status de um serviço, use o seguinte comando do PowerShell 6:
Get-Service -Name {SERVICE NAME}
O status é relatado como um dos seguintes valores:
Starting
Running
Stopping
Stopped
Parar um serviço
Pare um serviço com o seguinte comando do PowerShell 6:
Stop-Service -Name {SERVICE NAME}
Remover um serviço
Após um pequeno atraso para interromper um serviço, remova um serviço com o seguinte comando do PowerShell 6:
Remove-Service -Name {SERVICE NAME}
Cenários de servidor proxy e balanceador de carga
Serviços que interagem com solicitações da Internet ou de uma rede corporativa e estão atrás de um proxy ou balanceador de carga podem exigir configuração adicional. Para obter mais informações, consulte Configurar ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.
Configurar pontos de extremidade
Por padrão, ASP.NET Core se liga a http://localhost:5000
. Configure a URL e a porta definindo a variável de ambiente ASPNETCORE_URLS
.
Para abordagens adicionais de configuração de URL e porta, consulte o artigo do servidor relevante:
As orientações anteriores abrangem o suporte para pontos de extremidade HTTPS. Por exemplo, configure o aplicativo para HTTPS quando a autenticação for usada com um Serviço do Windows.
Observação
Não há suporte para usar o certificado de desenvolvimento HTTPS do ASP.NET Core para proteger um endpoint de serviço.
Diretório atual e raiz de conteúdo
O diretório de trabalho atual retornado chamando
Usar "ContentRootPath" ou "ContentRootFileProvider"
Use ou ContentRootFileProvider IHostEnvironment.ContentRootPath para localizar os recursos de um aplicativo.
Quando o aplicativo é executado como um serviço, UseWindowsService define o ContentRootPath como AppContext.BaseDirectory.
Os ficheiros de configuração padrão do aplicativo, appsettings.json
e appsettings.{Environment}.json
, são carregados a partir da raiz de conteúdo do aplicativo ao chamar CreateDefaultBuilder durante a configuração do host.
Para outros ficheiros de configurações carregados pelo código do desenvolvedor no ConfigureAppConfiguration, não é necessário chamar SetBasePath. No exemplo a seguir, o arquivo custom_settings.json
existe na raiz de conteúdo do aplicativo e é carregado sem definir explicitamente um caminho base:
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>();
});
}
Não tente usar
Armazene os arquivos de um serviço em um local adequado no disco
Especifique um caminho absoluto com SetBasePath ao usar um IConfigurationBuilder para a pasta que contém os arquivos.
Solução de problemas
Para solucionar problemas de uma aplicação de serviço Windows, consulte Solucionar problemas e depurar projetos do ASP.NET Core.
Erros comuns
- Uma versão antiga ou de pré-lançamento do PowerShell está em uso.
- O serviço registrado não usa o publicado do aplicativo saída do comando dotnet publish. A saída do comando dotnet build não é compatível com a implantação de aplicações. Os ativos publicados são encontrados em uma das seguintes pastas, dependendo do tipo de implantação:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- O serviço não está no estado em execução.
- Os caminhos para recursos que o aplicativo usa (por exemplo, certificados) estão incorretos. O caminho base de um serviço do Windows é c:\Windows\System32.
- O utilizador não tem direitos de iniciar sessão como um serviço.
- A senha do usuário expirou ou foi passada incorretamente ao executar o comando
New-Service
PowerShell. - O aplicativo requer autenticação ASP.NET Core, mas não está configurado para conexões seguras (HTTPS).
- A porta URL da solicitação está incorreta ou não está configurada corretamente no aplicativo.
Logs de eventos do sistema e do aplicativo
Acesse os logs de eventos do sistema e do aplicativo:
- Abra o menu Iniciar, procure Visualizador de Eventose selecione a aplicação Visualizador de Eventos.
- No Visualizador de Eventos, abra o nó de Registos do Windows.
- Selecione Sistema para abrir o Registo de Eventos do Sistema. Selecione Aplicação para abrir o Log de Eventos da Aplicação.
- Procure erros associados à aplicação que está a falhar.
Execute o aplicativo em um prompt de comando
Muitos erros de inicialização não produzem informações úteis nos logs de eventos. Você pode encontrar a causa de alguns erros executando o aplicativo em um prompt de comando no sistema de hospedagem. Para registrar detalhes adicionais do aplicativo, diminua o nível de log ou execute o aplicativo no ambiente de desenvolvimento .
Limpar caches de pacotes
Um aplicativo em funcionamento pode falhar imediatamente após atualizar o SDK do .NET Core na máquina de desenvolvimento ou alterar as versões do pacote no aplicativo. Em alguns casos, pacotes incoerentes podem quebrar um aplicativo ao executar grandes atualizações. A maioria desses problemas pode ser corrigida seguindo estas instruções:
Exclua as pastas do compartimento ,, e obj.
Limpe os caches do pacote executando dotnet nuget locals all --clear de um shell de comando.
A limpeza de caches de pacotes também pode ser realizada com a ferramenta nuget.exe e executando o comando
nuget locals all -clear
. nuget.exe não é uma instalação integrada com o sistema operacional de desktop Windows e deve ser obtida separadamente do site NuGet.Restaure e reconstrua o projeto.
Exclua todos os arquivos na pasta de implantação no servidor antes de reimplantar o aplicativo.
Aplicação lenta ou sem resposta
Um de despejo de memória é um instantâneo da memória do sistema e pode ajudar a determinar a causa de um crash de aplicação, falha de inicialização ou aplicação lenta.
O aplicativo falha ou encontra uma exceção
Obtenha e analise um despejo do Relatório de Erros do Windows (WER) :
Crie uma pasta para armazenar arquivos de despejo de memória em
c:\dumps
.Execute o script EnableDumps PowerShell com o nome executável do aplicativo:
.\EnableDumps {APPLICATION EXE} c:\dumps
Execute o aplicativo nas condições que causam a falha.
Após a ocorrência da falha, execute o script DisableDumps PowerShell:
.\DisableDumps {APPLICATION EXE}
Depois que um aplicativo crasha e a coleta de dump é concluída, o aplicativo pode ser encerrado normalmente. O script do PowerShell configura o WER para coletar até cinco despejos por aplicativo.
Advertência
Os despejos de memória podem ocupar uma grande quantidade de espaço em disco (até vários gigabytes cada).
O aplicativo não responde, falha durante a inicialização ou é executado normalmente
Quando uma aplicação para de responder, mas não falha, ou falha durante a inicialização, ou executa normalmente, consulte User-Mode Arquivos de Despejo: Escolhendo a Melhor Ferramenta para selecionar uma ferramenta apropriada para produzir o despejo.
Analise o despejo
Um despejo pode ser analisado usando várias abordagens. Para obter mais informações, consulte Analisando um arquivo de despejo de User-Mode.
Recursos adicionais
- Configuração do endpointKestrel (inclui configuração HTTPS e suporte SNI)
- Host Genérico do .NET no ASP.NET Core
- Solucionar problemas e depurar projetos ASP.NET Core