Värda ASP.NET Core i en Windows-tjänst
Anteckning
Det här är inte den senaste versionen av den här artikeln. För den aktuella versionen, se .NET 9-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
Viktig
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
Den aktuella versionen finns i den .NET 9-versionen av den här artikeln.
En ASP.NET Core-app kan hanteras i Windows som en Windows Service- utan att använda IIS. När appen körs som en Windows-tjänst startar den automatiskt efter att servern har startats om.
Förutsättningar
Arbetstjänstmall
Mallen ASP.NET Core Worker Service är en startpunkt för att skriva tidskrävande tjänstappar. Så här använder du mallen som grund för en Windows Service-app:
- Skapa en Worker Service-app från .NET Core-mallen.
- Installera NuGet-paketet Microsoft.Extensions.Hosting.WindowsServices.
- Följ anvisningarna i avsnittet Appkonfiguration för att uppdatera Worker Service-appen så att den kan köras som en Windows-tjänst.
- Skapa ett nytt projekt.
- Välj Worker Service. Välj Nästa.
- Ange ett projektnamn i fältet Projektnamn eller godkänn standardprojektets namn. Välj Skapa.
- I dialogrutan Skapa en ny Arbetstjänst väljer du Skapa.
Appkonfiguration
Uppdatera Program.cs för att anropa AddWindowsService. När appen körs som en Windows-tjänst AddWindowsService
:
- Anger värdlivslängden till
WindowsServiceLifetime
. - Ställer in innehållsroten till AppContext.BaseDirectory. Mer information finns i avsnittet Aktuell katalog och innehållsrot.
- Aktiverar loggning till händelseloggen:
- Programnamnet används som standardkällnamn.
- Standardloggnivån är Varning eller högre för en app som baseras på en ASP.NET Core-mall som anropar
CreateDefaultBuilder
för att skapa värdservern. - Åsidosätt standardloggnivån med
Logging:EventLog:LogLevel:Default
-nyckeln iappsettings.json
/appsettings.{Environment}.json
eller annan konfigurationsprovider. - Endast administratörer kan skapa nya händelsekällor. När en händelsekälla inte kan skapas med programnamnet, loggas en varning till Program och käll- och händelseloggar inaktiveras.
Överväg följande ServiceA
-klass:
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.");
}
}
Följande Program.cs
anropar AddHostedService
för att registrera 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();
Följande exempelappar medföljer det här avsnittet:
- Exempel på Background Worker Service: Ett exempel på en icke-webbapp som baseras på mallen Worker Service som använder värdbaserade tjänster för bakgrundsaktiviteter.
- Exempel på Web App Service: Ett Razor Pages-webbappexempel som körs som en Windows-tjänst med värdbaserade tjänster för bakgrundsaktiviteter.
MVC-vägledning finns i artiklarna i Översikt över ASP.NET Core MVC och Migrera från ASP.NET Core 2.2 till 3.0.
Distributionstyp
Information och råd om distributionsscenarier finns i .NET Core-programdistribution.
SDK
För en webbappbaserad tjänst som använder ramverken Razor Pages eller MVC anger du webb-SDK:t i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Web">
Om tjänsten bara kör bakgrundsaktiviteter (till exempel värdbaserade tjänster) anger du Worker SDK i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Ramverksberoende distribution (FDD)
Ramverksberoende distribution (FDD) förlitar sig på förekomsten av en delad systemomfattande version av .NET Core i målsystemet. När FDD-scenariot antas enligt vägledningen i den här artikeln skapar SDK:n en körbar (.exe), som kallas en ramverksberoende körbar.
Om du använder Web SDKär en web.config-fil, som normalt skapas när du publicerar en ASP.NET Core-app, onödig för en Windows Services-app. Om du vill inaktivera skapandet av web.config-filen lägger du till egenskapen <IsTransformWebConfigDisabled>
i true
.
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Fristående distribution (SCD)
Fristående distribution (SCD) förlitar sig inte på förekomsten av ett delat ramverk i värdsystemet. Körtiden och appens beroenden distribueras med appen.
En Windows Runtime Identifier (RID) ingår i <PropertyGroup>
som innehåller målramverket:
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
Så här publicerar du för flera RID:ar:
- Ange RID:erna i en semikolonavgränsad lista.
- Använd egenskapsnamnet <RuntimeIdentifiers> (plural).
Mer information finns i .NET Core RID Catalog.
Tjänstanvändarkonto
Om du vill skapa ett användarkonto för en tjänst använder du cmdleten New-LocalUser från ett administrativt PowerShell 6-kommandogränssnitt.
I Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763) eller senare:
New-LocalUser -Name {SERVICE NAME}
I Windows OS tidigare än Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Ange ett starkt lösenord när du uppmanas att göra det.
Om inte parametern -AccountExpires
anges till cmdleten New-LocalUser med en förfallotid DateTimeupphör kontot inte att gälla.
Mer information finns i Microsoft.PowerShell.LocalAccounts och tjänstanvändarkonton.
En alternativ metod för att hantera användare när du använder Active Directory är att använda hanterade tjänstkonton. För mer information, se översikt över grupphanterade tjänstkonton.
Rättigheter för inloggning som tjänst
Så här upprättar du Logga in som en tjänst rättigheter för ett tjänstanvändarkonto:
- Öppna redigeraren för lokal säkerhetspolicy genom att köra secpol.msc.
- Expandera noden lokala principer och välj Tilldelning av användarrättigheter.
- Öppna Logga in som en tjänst princip.
- Välj Lägg till användare eller grupp.
- Ange objektnamnet (användarkontot) med någon av följande metoder:
- Skriv användarkontot (
{DOMAIN OR COMPUTER NAME\USER}
) i namnfältet för objekt och välj OK för att lägga till användaren i policyn. - Välj Avancerat. Välj Hitta nu. Välj användarkontot i listan. Välj OK. Välj OK igen för att lägga till användaren i policyn.
- Skriv användarkontot (
- Välj OK eller Använd för att godkänna ändringarna.
Skapa och hantera Windows-tjänsten
Skapa en tjänst
Använd PowerShell-kommandon för att registrera en tjänst. Kör följande kommandon från ett administrativt PowerShell 6-kommandogränssnitt:
$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}
: Sökvägen till appens exekverbara fil på värden (till exempeld:\myservice
). Inkludera inte appens körbara filnamn i sökvägen. Ett avslutande snedstreck krävs inte. -
{DOMAIN OR COMPUTER NAME\USER}
: Tjänstanvändarkonto (till exempelContoso\ServiceUser
). -
{SERVICE NAME}
: Tjänstnamn (till exempelMyService
). -
{EXE FILE PATH}
: Applikationens fullständiga körbara sökväg (till exempeld:\myservice\myservice.exe
). Inkludera filnamnet för den körbara filen med filändelsen. -
{EXE FOLDER PATH}
: Appens fullständiga körbara mappsökväg (till exempeld:\myservice
). -
{DESCRIPTION}
: Tjänstbeskrivning (till exempelMy sample service
). -
{DISPLAY NAME}
: Tjänstvisningsnamn (till exempelMy Service
).
Starta en tjänst
Starta en tjänst med följande PowerShell 6-kommando:
Start-Service -Name {SERVICE NAME}
Kommandot tar några sekunder att starta tjänsten.
Fastställa status för en tjänst
Om du vill kontrollera status för en tjänst använder du följande PowerShell 6-kommando:
Get-Service -Name {SERVICE NAME}
Statusen rapporteras som ett av följande värden:
Starting
Running
Stopping
Stopped
Stoppa en tjänst
Stoppa en tjänst med följande PowerShell 6-kommando:
Stop-Service -Name {SERVICE NAME}
Ta bort en tjänst
Efter en kort fördröjning för att stoppa en tjänst tar du bort en tjänst med följande PowerShell 6-kommando:
Remove-Service -Name {SERVICE NAME}
Scenarier för proxyserver och lastbalanserare
Tjänster som interagerar med begäranden från Internet eller ett företagsnätverk och som finns bakom en proxy eller lastbalanserare kan kräva ytterligare konfiguration. Mer information finns i Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare.
Konfigurera slutpunkter
Som standard binder ASP.NET Core till http://localhost:5000
. Konfigurera URL:en och porten genom att ange miljövariabeln ASPNETCORE_URLS
.
Ytterligare metoder för URL- och portkonfiguration finns i relevant serverartikel:
- Konfigurera slutpunkter för webbservern ASP.NET Core Kestrel
- HTTP.sys webbserverimplementering i ASP.NET Core
Föregående vägledning omfattar stöd för HTTPS-slutpunkter. Konfigurera till exempel appen för HTTPS när autentisering används med en Windows-tjänst.
Not
Användning av ASP.NET Core HTTPS-utvecklingscertifikat för att skydda en tjänstslutpunkt stöds inte.
Aktuell katalog och innehållsrot
Den aktuella arbetskatalogen som returneras genom att anropa GetCurrentDirectory för en Windows-tjänst är mappen C:\WINDOWS\system32. Mappen system32 är inte en lämplig plats för att lagra en tjänsts filer (till exempel inställningsfiler). Använd någon av följande metoder för att underhålla och komma åt en tjänsts tillgångar och inställningsfiler.
Använda ContentRootPath eller ContentRootFileProvider
Använd IHostEnvironment.ContentRootPath eller ContentRootFileProvider för att hitta en apps resurser.
När appen körs som en tjänst anger UseWindowsServiceContentRootPath till AppContext.BaseDirectory.
Appens standardinställningsfiler, appsettings.json
och appsettings.{Environment}.json
, läses in från appens innehållsrot genom att anropa CreateDefaultBuilder under värdkonstruktionen.
För andra inställningar som läses in av utvecklarkod i ConfigureAppConfigurationbehöver du inte anropa SetBasePath. I följande exempel finns den custom_settings.json
filen i appens innehållsrot och läses in utan att uttryckligen ange en bassökväg:
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>();
});
}
Försök inte använda GetCurrentDirectory för att hämta en resurssökväg eftersom en Windows Service-app returnerar mappen C:\WINDOWS\system32 som dess aktuella katalog.
Lagra en tjänsts filer på en lämplig plats på disken
Ange en absolut sökväg med SetBasePath när du använder en IConfigurationBuilder till mappen som innehåller filerna.
Felsöka
Information om hur du felsöker en Windows Service-app finns i Felsöka och debugga ASP.NET Core-projekt.
Vanliga fel
- En gammal eller förhandsversion av PowerShell används.
- Den registrerade tjänsten använder inte appens publicerade utdata från kommandot dotnet publish. Utdata från kommandot dotnet build stöds inte för appdistribution. Publicerade tillgångar finns i någon av följande mappar beroende på distributionstyp:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publicera (SCD)
- Tjänsten är inte i körläge.
- Sökvägarna till resurser som appen använder (till exempel certifikat) är felaktiga. Bassökvägen för en Windows-tjänst är c:\Windows\System32.
- Användaren har inte logga in som tjänst rättigheter.
- Användarens lösenord har upphört att gälla eller skickas felaktigt när du kör kommandot
New-Service
PowerShell. - Appen kräver ASP.NET Core-autentisering men är inte konfigurerad för säkra anslutningar (HTTPS).
- Url-porten för begäran är felaktig eller inte korrekt konfigurerad i appen.
System- och programhändelseloggar
Få åtkomst till system- och programhändelseloggarna:
- Öppna Start-menyn, sök efter Händelseloggoch välj appen Händelselogg.
- I Loggbokenöppnar du noden Windows-loggar.
- Välj System för att öppna systemhändelseloggen. Välj program för att öppna programhändelseloggen.
- Sök efter fel som är associerade med den misslyckade appen.
Kör appen i en kommandotolk
Många startfel ger inte användbar information i händelseloggarna. Du kan hitta orsaken till vissa fel genom att köra appen i en kommandotolk på värdsystemet. Om du vill logga ytterligare information från appen sänker du loggnivå eller kör appen i Utvecklingsmiljö.
Rensa paketcache
En fungerande app kan misslyckas omedelbart efter att ha uppgraderat .NET Core SDK på utvecklingsdatorn eller ändrat paketversioner i appen. I vissa fall kan inkonsekventa paket förstöra en app vid större uppgraderingar. De flesta av dessa problem kan åtgärdas genom att följa dessa instruktioner:
Ta bort bin och obj mappar.
Rensa paketcacheminnena genom att köra dotnet nuget locals all --clear från ett kommandogränssnitt.
Du kan också rensa paketcacheminnen med verktyget nuget.exe och köra kommandot
nuget locals all -clear
. nuget.exe är inte en paketerad installation med Windows-skrivbordsoperativsystemet och måste hämtas separat från NuGet-webbplatsen.Återställa och återskapa projektet.
Ta bort alla filer i distributionsmappen på servern innan du distribuerar om appen.
Långsam eller icke-svarande applikation
En kraschdump är en ögonblicksbild av systemets minne och kan hjälpa dig att fastställa orsaken till en appkrasch, ett startfel eller en långsam app.
Appen kraschar eller stöter på ett undantag
Hämta och analysera en dump från Windows Error Reporting (WER):
Skapa en mapp för att lagra kraschdumpfiler på
c:\dumps
.Kör EnableDumps PowerShell-skriptet med programmets körbara namn:
.\EnableDumps {APPLICATION EXE} c:\dumps
Kör appen under de förhållanden som orsakar kraschen.
När kraschen har inträffat kör du DisableDumps PowerShell-skriptet:
.\DisableDumps {APPLICATION EXE}
När en app kraschar och dumpsamlingen har slutförts kan appen avslutas normalt. PowerShell-skriptet konfigurerar WER för att samla in upp till fem dumpar per app.
Varning
Kraschdumpar kan ta upp en stor mängd diskutrymme (upp till flera gigabyte vardera).
Appen svarar inte, misslyckas vid start eller körs normalt
När en app slutar svara men inte kraschar, misslyckas vid start eller körs normalt kan du läsa User-Mode Dump Files: Välja det bästa verktyget för att välja ett lämpligt verktyg för att skapa dumpen.
Analysera datadumpen
En dump kan analyseras med flera metoder. Mer information finns i Analysera en User-Mode dumpfil.
Ytterligare resurser
- Visa eller ladda ned exempelkod (hur du laddar ned)
- Kestrel slutpunktskonfiguration (inkluderar HTTPS-konfiguration och SNI-stöd)
- .NET Generic Host i ASP.NET Core
- Felsöka och avlusa ASP.NET Core-projekt
En ASP.NET Core-app kan hanteras i Windows som en Windows Service- utan att använda IIS. När appen körs som en Windows-tjänst startar den automatiskt efter att servern har startats om.
Visa eller ladda ned exempelkod (hur du laddar ned)
Förutsättningar
Arbetstjänstmall
Mallen ASP.NET Core Worker Service är en startpunkt för att skriva tidskrävande tjänstappar. Så här använder du mallen som grund för en Windows Service-app:
- Skapa en Worker Service-app från .NET Core-mallen.
- Följ anvisningarna i avsnittet Appkonfiguration för att uppdatera Worker Service-appen så att den kan köras som en Windows-tjänst.
- Skapa ett nytt projekt.
- Välj Worker Service. Välj Nästa.
- Ange ett projektnamn i fältet Projektnamn eller godkänn standardprojektets namn. Välj Skapa.
- I dialogrutan Skapa en ny Arbetstjänst väljer du Skapa.
Appkonfiguration
Appen kräver en paketreferens för Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
anropas när värden byggs. Om appen körs som en Windows-tjänst, metoden:
- Anger värdlivslängden till
WindowsServiceLifetime
. - Ställer in innehållsroten till AppContext.BaseDirectory. Mer information finns i avsnittet Aktuell katalog och innehållsrot.
- Aktiverar loggning till händelseloggen:
- Programnamnet används som standardkällnamn.
- Standardloggnivån är Varning eller högre för en app baserat på en ASP.NET Core-mall som anropar
CreateDefaultBuilder
för att skapa värden. - Åsidosätt standardloggnivån med
Logging:EventLog:LogLevel:Default
-nyckeln iappsettings.json
/appsettings.{Environment}.json
eller annan konfigurationsprovider. - Endast administratörer kan skapa nya händelsekällor. När en händelsekälla inte kan skapas med programnamnet loggas en varning till Program, och käll- och händelseloggar inaktiveras.
I Program.cs
:
- Ange
ContentRootPath
- Ring
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();
Följande exempelappar medföljer det här avsnittet:
- Exempel på Background Worker Service: Ett exempel på en icke-webbapp som baseras på mallen Worker Service som använder värdbaserade tjänster för bakgrundsaktiviteter.
- Exempel på Web App Service: Ett Razor Pages-webbappexempel som körs som en Windows-tjänst med värdbaserade tjänster för bakgrundsaktiviteter.
MVC-vägledning finns i artiklarna i Översikt över ASP.NET Core MVC och Migrera från ASP.NET Core 2.2 till 3.0.
Distributionstyp
Information och råd om distributionsscenarier finns i .NET Core-programdistribution.
SDK
För en webbappbaserad tjänst som använder ramverken Razor Pages eller MVC anger du webb-SDK:t i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Web">
Om tjänsten bara kör bakgrundsaktiviteter (till exempel värdbaserade tjänster) anger du Worker SDK i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Ramverksberoende distribution (FDD)
Ramverksberoende distribution (FDD) förlitar sig på förekomsten av en delad systemomfattande version av .NET Core i målsystemet. När FDD-scenariot antas enligt vägledningen i den här artikeln skapar SDK:n en körbar (.exe), som kallas en ramverksberoende körbar.
Om du använder Web SDKär en web.config-fil, som normalt skapas när du publicerar en ASP.NET Core-app, onödig för en Windows Services-app. Om du vill inaktivera skapandet av web.config-filen lägger du till egenskapen <IsTransformWebConfigDisabled>
i true
.
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Självförsörjande driftsättning (SCD)
Fristående distribution (SCD) förlitar sig inte på förekomsten av ett delat ramverk i värdsystemet. Körtiden och appens beroenden distribueras tillsammans med appen.
En Windows Runtime Identifier (RID) ingår i <PropertyGroup>
som innehåller målramverket:
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Så här publicerar du för flera RID:ar:
- Ange RID:erna i en semikolonavgränsad lista.
- Använd egenskapsnamnet <RuntimeIdentifiers> (plural).
Mer information finns i .NET Core RID Catalog.
Tjänstanvändarkonto
Om du vill skapa ett användarkonto för en tjänst använder du cmdleten New-LocalUser från ett administrativt PowerShell 6-kommandogränssnitt.
I Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763) eller senare:
New-LocalUser -Name {SERVICE NAME}
I Windows OS tidigare än Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Ange ett starkt lösenord när du uppmanas att göra det.
Om inte parametern -AccountExpires
anges till cmdleten New-LocalUser med en förfallotid DateTimeupphör kontot inte att gälla.
Mer information finns i Microsoft.PowerShell.LocalAccounts och tjänstanvändarkonton.
En alternativ metod för att hantera användare när du använder Active Directory är att använda hanterade tjänstkonton. För mer information, se översikten över grupphanterade tjänstkonton .
Logga in som en tjänstbehörighet
Så här upprättar du logga in som en tjänst rättigheter för ett tjänstanvändarkonto:
- Öppna redigeraren för lokala säkerhetsprinciper genom att köra secpol.msc.
- Expandera noden lokala principer och välj Tilldelning av användarrättigheter.
- Öppna Logga in som en tjänst policy.
- Välj Lägg till användare eller grupp.
- Ange objektnamnet (användarkontot) med någon av följande metoder:
- Skriv in användarkontot (
{DOMAIN OR COMPUTER NAME\USER}
) i fältet för objektnamn och välj OK för att lägga till användaren i policyn. - Välj Avancerat. Välj Hitta nu. Välj användarkontot i listan. Välj OK. Välj OK igen för att lägga till användaren i policyn.
- Skriv in användarkontot (
- Välj OK eller Använd för att godkänna ändringarna.
Skapa och hantera Windows-tjänsten
Skapa en tjänst
Använd PowerShell-kommandon för att registrera en tjänst. Kör följande kommandon från ett administrativt PowerShell 6-kommandogränssnitt:
$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}
: Sökvägen till appens körbara fil på värden (till exempeld:\myservice
). Inkludera inte appens körbara filnamn i sökvägen. Ett avslutande snedstreck krävs inte. -
{DOMAIN OR COMPUTER NAME\USER}
: Tjänstanvändarkonto (till exempelContoso\ServiceUser
). -
{SERVICE NAME}
: Tjänstnamn (till exempelMyService
). -
{EXE FILE PATH}
: Appens fullständiga exekverbara sökväg (till exempeld:\myservice\myservice.exe
). Inkludera filnamnet på den körbara filen och dess filtillägg. -
{EXE FOLDER PATH}
: Appens fullständiga körbara mappsökväg (till exempeld:\myservice
). -
{DESCRIPTION}
: Tjänstbeskrivning (till exempelMy sample service
). -
{DISPLAY NAME}
: Tjänstvisningsnamn (till exempelMy Service
).
Starta en tjänst
Starta en tjänst med följande PowerShell 6-kommando:
Start-Service -Name {SERVICE NAME}
Kommandot tar några sekunder att starta tjänsten.
Fastställa status för en tjänst
Om du vill kontrollera status för en tjänst använder du följande PowerShell 6-kommando:
Get-Service -Name {SERVICE NAME}
Statusen rapporteras som ett av följande värden:
Starting
Running
Stopping
Stopped
Stoppa en tjänst
Stoppa en tjänst med följande PowerShell 6-kommando:
Stop-Service -Name {SERVICE NAME}
Ta bort en tjänst
Efter en kort fördröjning för att stoppa en tjänst tar du bort en tjänst med följande PowerShell 6-kommando:
Remove-Service -Name {SERVICE NAME}
Scenarier för proxyserver och lastbalanserare
Tjänster som interagerar med begäranden från Internet eller ett företagsnätverk och som finns bakom en proxy eller lastbalanserare kan kräva ytterligare konfiguration. Mer information finns i Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare.
Konfigurera slutpunkter
Som standard binder ASP.NET Core till http://localhost:5000
. Konfigurera URL:en och porten genom att ange miljövariabeln ASPNETCORE_URLS
.
Ytterligare metoder för URL- och portkonfiguration finns i relevant serverartikel:
- Konfigurera slutpunkter för webbservern ASP.NET Core Kestrel
- HTTP.sys webbserverimplementering i ASP.NET Core
Föregående vägledning omfattar stöd för HTTPS-slutpunkter. Konfigurera till exempel appen för HTTPS när autentisering används med en Windows-tjänst.
Not
Användning av ASP.NET Core HTTPS-utvecklingscertifikat för att skydda en tjänstslutpunkt stöds inte.
Aktuell mapp och innehållsrot
Den aktuella arbetskatalogen som returneras genom att anropa GetCurrentDirectory för en Windows-tjänst är mappen C:\WINDOWS\system32. Mappen system32 är inte en lämplig plats för att lagra en tjänsts filer (till exempel inställningsfiler). Använd någon av följande metoder för att underhålla och komma åt en tjänsts tillgångar och inställningsfiler.
Använda ContentRootPath eller ContentRootFileProvider
Använd IHostEnvironment.ContentRootPath eller ContentRootFileProvider för att hitta en apps resurser.
När appen körs som en tjänst anger UseWindowsServiceContentRootPath till AppContext.BaseDirectory.
Appens standardinställningsfiler, appsettings.json
och appsettings.{Environment}.json
, läses in från appens innehållsrot genom att anropa CreateDefaultBuilder under värdkonstruktionen.
För andra inställningar som läses in av utvecklarkod i ConfigureAppConfigurationbehöver du inte anropa SetBasePath. I följande exempel finns den custom_settings.json
filen i appens innehållsrot och läses in utan att uttryckligen ange en bassökväg:
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>();
});
}
Försök inte använda GetCurrentDirectory för att hämta en resurssökväg eftersom en Windows Service-app returnerar mappen C:\WINDOWS\system32 som dess aktuella katalog.
Lagra en tjänsts filer på en lämplig plats på disken
Ange en absolut sökväg med SetBasePath när du använder en IConfigurationBuilder till mappen som innehåller filerna.
Felsöka
Information om hur du felsöker en Windows Service-app finns i Felsöka och debugga ASP.NET Core-projekt.
Vanliga fel
- En gammal eller förhandsversion av PowerShell används.
- Den registrerade tjänsten använder inte applikationens publicerade utdata från kommandot dotnet publish. Utdata från kommandot dotnet build stöds inte för appdistribution. Publicerade tillgångar finns i någon av följande mappar beroende på distributionstyp:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- Tjänsten är inte i körtillståndet.
- Sökvägarna till resurser som appen använder (till exempel certifikat) är felaktiga. Bassökvägen för en Windows-tjänst är c:\Windows\System32.
- Användaren har inte logga in som en tjänst rättigheter.
- Användarens lösenord har upphört att gälla eller skickas felaktigt när du kör kommandot
New-Service
PowerShell. - Appen kräver ASP.NET Core-autentisering men är inte konfigurerad för säkra anslutningar (HTTPS).
- Url-porten för begäran är felaktig eller inte korrekt konfigurerad i appen.
System- och programhändelseloggar
Få åtkomst till system- och programhändelseloggarna:
- Öppna Start-menyn, sök efter Händelseloggoch välj appen Händelselogg.
- I Loggbokenöppnar du noden Windows-loggar.
- Välj System för att öppna systemhändelseloggen. Välj program för att öppna programhändelseloggen.
- Sök efter fel som är associerade med den misslyckade appen.
Kör appen i en kommandotolk
Många startfel ger inte användbar information i händelseloggarna. Du kan hitta orsaken till vissa fel genom att köra appen i en kommandotolk på värdsystemet. Om du vill logga ytterligare information från appen sänker du loggnivå eller kör appen i Utvecklingsmiljö.
Rensa paketcacherna
En fungerande app kan misslyckas omedelbart efter att ha uppgraderat .NET Core SDK på utvecklingsdatorn eller ändrat paketversioner i appen. I vissa fall kan osammanhängande paket orsaka att en app slutar fungera vid större uppgraderingar. De flesta av dessa problem kan åtgärdas genom att följa dessa instruktioner:
Ta bort bin och obj mappar.
Rensa paketcacheminnena genom att köra dotnet nuget locals all --clear från ett kommandogränssnitt.
Du kan också rensa paketcacheminnen med verktyget nuget.exe och köra kommandot
nuget locals all -clear
. nuget.exe är inte en paketerad installation med Windows-skrivbordsoperativsystemet och måste hämtas separat från NuGet-webbplatsen.Återställa och återskapa projektet.
Ta bort alla filer i distributionsmappen på servern innan du distribuerar om appen.
Långsam eller icke-svarar-app
En kraschdump är en ögonblicksbild av systemets minne och kan hjälpa dig att fastställa orsaken till en appkrasch, ett startfel eller en långsam app.
Appen kraschar eller stöter på ett undantag
Hämta och analysera en dump från Windows Error Reporting (WER):
Skapa en mapp för att lagra kraschdumpfiler på
c:\dumps
.Kör EnableDumps PowerShell-skriptet med programmets körbara namn:
.\EnableDumps {APPLICATION EXE} c:\dumps
Kör appen under de förhållanden som orsakar kraschen.
När kraschen har inträffat kör du DisableDumps PowerShell-skriptet:
.\DisableDumps {APPLICATION EXE}
När en app kraschar och dumpsamlingen har slutförts kan appen avslutas normalt. PowerShell-skriptet konfigurerar WER för att samla in upp till fem dumpar per app.
Varning
Kraschdumpar kan ta upp en stor mängd diskutrymme (upp till flera gigabyte vardera).
Appen svarar inte, misslyckas vid start eller körs normalt
När en app slutar svara men inte kraschar, misslyckas vid start eller körs normalt kan du läsa User-Mode Dump Files: Välja det bästa verktyget för att välja ett lämpligt verktyg för att skapa dumpen.
Analysera dumpen
En dump kan analyseras med flera metoder. Mer information finns i Analysera en User-Mode dumpfil.
Ytterligare resurser
- Kestrel slutpunktskonfiguration (inkluderar HTTPS-konfiguration och SNI-stöd)
- .NET Generic Host i ASP.NET Core
- Felsöka och avbugga ASP.NET Core-projekt
En ASP.NET Core-app kan hanteras i Windows som en Windows Service- utan att använda IIS. När appen körs som en Windows-tjänst startar den automatiskt efter att servern har startats om.
Visa eller ladda ned exempelkod (hur du laddar ned)
Förutsättningar
Arbetstjänstmall
Mallen ASP.NET Core Worker Service är en startpunkt för att skriva tidskrävande tjänstappar. Så här använder du mallen som grund för en Windows Service-app:
- Skapa en Worker Service-app från .NET Core-mallen.
- Följ anvisningarna i avsnittet Appkonfiguration för att uppdatera Worker Service-appen så att den kan köras som en Windows-tjänst.
- Skapa ett nytt projekt.
- Välj Worker Service. Välj Nästa.
- Ange ett projektnamn i fältet Projektnamn eller godkänn standardprojektets namn. Välj Skapa.
- I dialogrutan Skapa en ny Arbetstjänst väljer du Skapa.
Appkonfiguration
Appen kräver en paketreferens för Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
anropas när värden skapas. Om appen körs som en Windows-tjänst, metoden:
- Anger värdlivslängden till
WindowsServiceLifetime
. - Anger innehållsroten till AppContext.BaseDirectory. Mer information finns i avsnittet Aktuell katalog och innehållsrot.
- Aktiverar loggning till händelseloggen:
- Programnamnet används som standardkällnamn.
- Standardloggnivån är Varning eller högre för en app baserad på en ASP.NET Core-mall som anropar
CreateDefaultBuilder
för att skapa värd. - Åsidosätt standardloggnivån med
Logging:EventLog:LogLevel:Default
-nyckeln iappsettings.json
/appsettings.{Environment}.json
eller annan konfigurationsprovider. - Endast administratörer kan skapa nya händelsekällor. När en händelsekälla inte kan skapas med programnamnet, loggas en varning till Program-källan och händelseloggar inaktiveras.
I CreateHostBuilder
av Program.cs
:
Host.CreateDefaultBuilder(args)
.UseWindowsService()
...
Följande exempelappar medföljer det här avsnittet:
- Exempel på Background Worker Service: Ett exempel på en icke-webbapp som baseras på mallen Worker Service som använder värdbaserade tjänster för bakgrundsaktiviteter.
- Exempel på Web App Service: Ett Razor Pages-webbappexempel som körs som en Windows-tjänst med värdbaserade tjänster för bakgrundsaktiviteter.
MVC-vägledning finns i artiklarna i Översikt över ASP.NET Core MVC och Migrera från ASP.NET Core 2.2 till 3.0.
Distributionstyp
Information och råd om distributionsscenarier finns i .NET Core-programdistribution.
SDK
För en webbappbaserad tjänst som använder ramverken Razor Pages eller MVC anger du webb-SDK:t i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Web">
Om tjänsten bara kör bakgrundsaktiviteter (till exempel värdbaserade tjänster) anger du Worker SDK i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Ramverksberoende distribution (FDD)
Ramverksberoende distribution (FDD) förlitar sig på förekomsten av en delad systemomfattande version av .NET Core i målsystemet. När FDD-scenariot antas enligt vägledningen i den här artikeln skapar SDK:n en körbar (.exe), som kallas en ramverksberoende körbar.
Om du använder Web SDKär en web.config-fil, som normalt skapas när du publicerar en ASP.NET Core-app, onödig för en Windows Services-app. Om du vill inaktivera skapandet av web.config-filen lägger du till egenskapen <IsTransformWebConfigDisabled>
i true
.
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Fristående distribution (SCD)
Fristående distribution (SCD) förlitar sig inte på förekomsten av ett delat ramverk i värdsystemet. Runtime och appens beroenden distribueras med appen.
En Windows Runtime Identifier (RID) ingår i <PropertyGroup>
som innehåller målramverket:
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Så här publicerar du för flera RID:ar:
- Ange RID:erna i en semikolonavgränsad lista.
- Använd egenskapsnamnet <RuntimeIdentifiers> (plural).
Mer information finns i .NET Core RID Catalog.
Tjänstanvändarkonto
Om du vill skapa ett användarkonto för en tjänst använder du cmdleten New-LocalUser från ett administrativt PowerShell 6-kommandogränssnitt.
I Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763) eller senare:
New-LocalUser -Name {SERVICE NAME}
I Windows OS tidigare än Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Ange ett starkt lösenord när du uppmanas att göra det.
Om inte parametern -AccountExpires
anges till cmdleten New-LocalUser med en förfallotid DateTimeupphör kontot inte att gälla.
Mer information finns i Microsoft.PowerShell.LocalAccounts och Tjänster och Användarkonton.
En alternativ metod för att hantera användare när du använder Active Directory är att använda hanterade tjänstkonton. Mer information finns i översikt över grupphanterade tjänstkonton .
Rättighet att logga in som tjänst
Så här upprättar du logga in som en tjänst rättigheter för ett tjänstanvändarkonto:
- Öppna redigeraren för lokala säkerhetsprinciper genom att köra secpol.msc.
- Expandera noden lokala principer och välj Tilldelning av användarrättigheter.
- Öppna Logga in som tjänst policy.
- Välj Lägg till användare eller grupp.
- Ange objektnamnet (användarkontot) med någon av följande metoder:
- Skriv användarkontot (
{DOMAIN OR COMPUTER NAME\USER}
) i fältet objektnamn och välj OK för att lägga till användaren i policyn. - Välj Avancerat. Välj Hitta nu. Välj användarkontot i listan. Välj OK. Välj OK igen för att lägga till användaren i policyn.
- Skriv användarkontot (
- Välj OK eller Använd för att godkänna ändringarna.
Skapa och hantera Windows-tjänsten
Skapa en tjänst
Använd PowerShell-kommandon för att registrera en tjänst. Kör följande kommandon från ett administrativt PowerShell 6-kommandogränssnitt:
$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}
: Sökvägen till appens körbara fil på värden (till exempeld:\myservice
). Inkludera inte appens körbara filnamn i sökvägen. Ett avslutande snedstreck krävs inte. -
{DOMAIN OR COMPUTER NAME\USER}
: Tjänstanvändarkonto (till exempelContoso\ServiceUser
). -
{SERVICE NAME}
: Tjänstnamn (till exempelMyService
). -
{EXE FILE PATH}
: Appens fullständiga körbara sökväg (till exempeld:\myservice\myservice.exe
). Inkludera filnamnet för den körbara filen med filtillägget. -
{DESCRIPTION}
: Tjänstbeskrivning (till exempelMy sample service
). -
{DISPLAY NAME}
: Tjänstvisningsnamn (till exempelMy Service
).
Starta en tjänst
Starta en tjänst med följande PowerShell 6-kommando:
Start-Service -Name {SERVICE NAME}
Kommandot tar några sekunder att starta tjänsten.
Fastställa status för en tjänst
Om du vill kontrollera status för en tjänst använder du följande PowerShell 6-kommando:
Get-Service -Name {SERVICE NAME}
Statusen rapporteras som ett av följande värden:
Starting
Running
Stopping
Stopped
Stoppa en tjänst
Stoppa en tjänst med följande PowerShell 6-kommando:
Stop-Service -Name {SERVICE NAME}
Ta bort en tjänst
Efter en kort fördröjning för att stoppa en tjänst tar du bort en tjänst med följande PowerShell 6-kommando:
Remove-Service -Name {SERVICE NAME}
Scenarier för proxyserver och lastbalanserare
Tjänster som interagerar med begäranden från Internet eller ett företagsnätverk och som finns bakom en proxy eller lastbalanserare kan kräva ytterligare konfiguration. Mer information finns i Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare.
Konfigurera slutpunkter
Som standard binder ASP.NET Core till http://localhost:5000
. Konfigurera URL:en och porten genom att ange miljövariabeln ASPNETCORE_URLS
.
Ytterligare metoder för URL- och portkonfiguration finns i relevant serverartikel:
- Konfigurera slutpunkter för webbservern ASP.NET Core Kestrel
- HTTP.sys webbserverimplementering i ASP.NET Core
Föregående vägledning omfattar stöd för HTTPS-slutpunkter. Konfigurera till exempel appen för HTTPS när autentisering används med en Windows-tjänst.
Not
Användning av ASP.NET Core HTTPS-utvecklingscertifikat för att skydda en tjänstslutpunkt stöds inte.
Aktuell mapp och innehållsrot
Den aktuella arbetskatalogen som returneras genom att anropa GetCurrentDirectory för en Windows-tjänst är mappen C:\WINDOWS\system32. Mappen system32 är inte en lämplig plats för att lagra en tjänsts filer (till exempel inställningsfiler). Använd någon av följande metoder för att underhålla och komma åt en tjänsts tillgångar och inställningsfiler.
Använda ContentRootPath eller ContentRootFileProvider
Använd IHostEnvironment.ContentRootPath eller ContentRootFileProvider för att hitta en apps resurser.
När appen körs som en tjänst anger UseWindowsServiceContentRootPath till AppContext.BaseDirectory.
Appens standardinställningsfiler, appsettings.json
och appsettings.{Environment}.json
, läses in från appens innehållsrot genom att anropa CreateDefaultBuilder under värdkonstruktionen.
För andra inställningar som läses in av utvecklarkod i ConfigureAppConfigurationbehöver du inte anropa SetBasePath. I följande exempel finns den custom_settings.json
filen i appens innehållsrot och läses in utan att uttryckligen ange en bassökväg:
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>();
});
}
Försök inte använda GetCurrentDirectory för att hämta en resurssökväg eftersom en Windows Service-app returnerar mappen C:\WINDOWS\system32 som dess aktuella katalog.
Lagra en tjänsts filer på en lämplig plats på disken
Ange en absolut sökväg med SetBasePath när du använder en IConfigurationBuilder till mappen som innehåller filerna.
Felsöka
Information om hur du felsöker en Windows-tjänstapp finns i Felsöka och avlusa ASP.NET Core-projekt.
Vanliga fel
- En gammal eller förhandsversion av PowerShell används.
- Den registrerade tjänsten använder inte appens publicerade utdata från kommandot dotnet publish. Utdata från kommandot dotnet build stöds inte för appdistribution. Publicerade tillgångar finns i någon av följande mappar beroende på distributionstyp:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- Tjänsten är inte i KÖR-läge.
- Sökvägarna till resurser som appen använder (till exempel certifikat) är felaktiga. Bassökvägen för en Windows-tjänst är c:\Windows\System32.
- Användaren har inte Logga in som en tjänst rättigheter.
- Användarens lösenord har upphört att gälla eller skickas felaktigt när du kör kommandot
New-Service
PowerShell. - Appen kräver ASP.NET Core-autentisering men är inte konfigurerad för säkra anslutningar (HTTPS).
- Url-porten för begäran är felaktig eller inte korrekt konfigurerad i appen.
System- och programhändelseloggar
Få åtkomst till system- och programhändelseloggarna:
- Öppna Start-menyn, sök efter Loggbokenoch välj appen Loggboken.
- I Loggboken, öppna noden Windows-loggar.
- Välj System för att öppna systemhändelseloggen. Välj program för att öppna programhändelseloggen.
- Sök efter fel som är associerade med den misslyckade appen.
Kör appen i en kommandotolk
Många startfel ger inte användbar information i händelseloggarna. Du kan hitta orsaken till vissa fel genom att köra appen i en kommandotolk på värdsystemet. Om du vill logga ytterligare information från appen sänker du loggnivå eller kör appen i Utvecklingsmiljö.
Rensa paketcache
En fungerande app kan misslyckas omedelbart efter att ha uppgraderat .NET Core SDK på utvecklingsdatorn eller ändrat paketversioner i appen. I vissa fall kan osammanhängande paket störa en app när man utför större uppgraderingar. De flesta av dessa problem kan åtgärdas genom att följa dessa instruktioner:
Ta bort bin och obj mappar.
Rensa paketcacheminnena genom att köra dotnet nuget locals all --clear från ett kommandogränssnitt.
Du kan också rensa paketcacheminnen med verktyget nuget.exe och köra kommandot
nuget locals all -clear
. nuget.exe är inte en paketerad installation med Windows-skrivbordsoperativsystemet och måste hämtas separat från NuGet-webbplatsen.Återställa och återskapa projektet.
Ta bort alla filer i distributionsmappen på servern innan du distribuerar om appen.
Långsam eller oresponsiv app
En kraschdump är en ögonblicksbild av systemets minne och kan hjälpa dig att fastställa orsaken till en appkrasch, ett startfel eller en långsam app.
Appen kraschar eller stöter på ett undantag
Hämta och analysera en dump från Windows Error Reporting (WER):
Skapa en mapp för att lagra kraschdumpfiler på
c:\dumps
.Kör EnableDumps PowerShell-skriptet med programmets körbara namn:
.\EnableDumps {APPLICATION EXE} c:\dumps
Kör appen under de förhållanden som orsakar kraschen.
När kraschen har inträffat kör du DisableDumps PowerShell-skriptet:
.\DisableDumps {APPLICATION EXE}
När en app kraschar och dumpsamlingen har slutförts kan appen avslutas normalt. PowerShell-skriptet konfigurerar WER för att samla in upp till fem dumpar per app.
Varning
Kraschdumpar kan ta upp en stor mängd diskutrymme (upp till flera gigabyte vardera).
Appen svarar inte, misslyckas vid start eller körs normalt
När en app slutar svara men inte kraschar, misslyckas vid start eller körs normalt kan du läsa User-Mode Dump Files: Välja det bästa verktyget för att välja ett lämpligt verktyg för att skapa dumpen.
Analysera dumpen
En dump kan analyseras med flera metoder. Mer information finns i Analysera en User-Mode dumpfil.
Ytterligare resurser
- Kestrel slutpunktskonfiguration (inkluderar HTTPS-konfiguration och SNI-stöd)
- .NET Generic Host i ASP.NET Core
- Felsöka och avlusa ASP.NET Core-projekt
En ASP.NET Core-app kan hanteras i Windows som en Windows Service- utan att använda IIS. När appen körs som en Windows-tjänst startar den automatiskt efter att servern har startats om.
Visa eller ladda ned exempelkod (hur du laddar ned)
Förutsättningar
Arbetstjänstmall
Mallen ASP.NET Core Worker Service är en startpunkt för att skriva tidskrävande tjänstappar. Så här använder du mallen som grund för en Windows Service-app:
- Skapa en Worker Service-app från .NET Core-mallen.
- Följ anvisningarna i avsnittet Appkonfiguration för att uppdatera Worker Service-appen så att den kan köras som en Windows-tjänst.
- Skapa ett nytt projekt.
- Välj Worker Service. Välj Nästa.
- Ange ett projektnamn i fältet Projektnamn eller godkänn standardprojektets namn. Välj Skapa.
- I dialogrutan Skapa en ny Arbetstjänst väljer du Skapa.
Appkonfiguration
Appen kräver en paketreferens för Microsoft.Extensions.Hosting.WindowsServices.
IHostBuilder.UseWindowsService
anropas när värden byggs. Om appen körs som en Windows-tjänst, metoden:
- Anger värdlivslängden till
WindowsServiceLifetime
. - Anger innehållsroten till AppContext.BaseDirectory. Mer information finns i avsnittet Aktuell katalog och innehållsrot.
- Aktiverar loggning till händelseloggen:
- Programnamnet används som standardkällnamn.
- Standardloggnivån är Varning eller högre för en app baserad på en ASP.NET Core-mall som anropar
CreateDefaultBuilder
för att skapa värden. - Åsidosätt standardloggnivån med
Logging:EventLog:LogLevel:Default
-nyckeln iappsettings.json
/appsettings.{Environment}.json
eller annan konfigurationsprovider. - Endast administratörer kan skapa nya händelsekällor. När en händelsekälla inte kan skapas med programnamnet, loggas en varning till Program-källan och händelseloggarna inaktiveras.
I CreateHostBuilder
av Program.cs
:
Host.CreateDefaultBuilder(args)
.UseWindowsService()
...
Följande exempelappar medföljer det här avsnittet:
- Exempel på Background Worker Service: Ett exempel på en icke-webbapp som baseras på mallen Worker Service som använder värdbaserade tjänster för bakgrundsaktiviteter.
- Exempel på Web App Service: Ett Razor Pages-webbappexempel som körs som en Windows-tjänst med värdbaserade tjänster för bakgrundsaktiviteter.
MVC-vägledning finns i artiklarna i Översikt över ASP.NET Core MVC och Migrera från ASP.NET Core 2.2 till 3.0.
Distributionstyp
Information och råd om distributionsscenarier finns i .NET Core-programdistribution.
SDK
För en webbappbaserad tjänst som använder ramverken Razor Pages eller MVC anger du webb-SDK:t i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Web">
Om tjänsten bara kör bakgrundsaktiviteter (till exempel värdbaserade tjänster) anger du Worker SDK i projektfilen:
<Project Sdk="Microsoft.NET.Sdk.Worker">
Ramverksberoende distribution (FDD)
Ramverksberoende distribution (FDD) förlitar sig på förekomsten av en delad systemomfattande version av .NET Core i målsystemet. När FDD-scenariot antas enligt vägledningen i den här artikeln, skapar SDK:n en körbar fil (.exe), benämnd som en ramverksberoende körbar .
Om du använder Web SDKär en web.config-fil, som normalt skapas när du publicerar en ASP.NET Core-app, onödig för en Windows Services-app. Om du vill inaktivera skapandet av web.config-filen lägger du till egenskapen <IsTransformWebConfigDisabled>
i true
.
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<IsTransformWebConfigDisabled>true</IsTransformWebConfigDisabled>
</PropertyGroup>
Fristående distribution (SCD)
Fristående distribution (SCD) förlitar sig inte på förekomsten av ett delat ramverk i värdsystemet. Körmiljön och appens beroenden distribueras tillsammans med appen.
En Windows Runtime Identifier (RID) ingår i <PropertyGroup>
som innehåller målramverket:
<RuntimeIdentifier>win7-x64</RuntimeIdentifier>
Så här publicerar du för flera RID:ar:
- Ange RID:erna i en semikolonavgränsad lista.
- Använd egenskapsnamnet <RuntimeIdentifiers> (plural).
Mer information finns i .NET Core RID Catalog.
Tjänstanvändarkonto
Om du vill skapa ett användarkonto för en tjänst använder du cmdleten New-LocalUser från ett administrativt PowerShell 6-kommandogränssnitt.
I Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763) eller senare:
New-LocalUser -Name {SERVICE NAME}
I Windows OS tidigare än Windows 10 Oktober 2018 Update (version 1809/build 10.0.17763):
powershell -Command "New-LocalUser -Name {SERVICE NAME}"
Ange ett starkt lösenord när du uppmanas att göra det.
Om inte parametern -AccountExpires
anges till cmdleten New-LocalUser med en förfallotid DateTimeupphör kontot inte att gälla.
Mer information finns i Microsoft.PowerShell.LocalAccounts och Tjänstanvändarkonton.
En alternativ metod för att hantera användare när du använder Active Directory är att använda hanterade tjänstkonton. Mer information finns i översikt över grupphanterade tjänstekonton.
Logga in med tjänstbehörigheter
Så här upprättar du logga in som en tjänst rättigheter för ett tjänstanvändarkonto:
- Öppna redigeraren för lokala säkerhetsinställningar genom att köra secpol.msc.
- Expandera noden lokala principer och välj Tilldelning av användarrättigheter.
- Öppna Logga in som tjänst policy.
- Välj Lägg till användare eller grupp.
- Ange objektnamnet (användarkontot) med någon av följande metoder:
- Skriv användarkontot (
{DOMAIN OR COMPUTER NAME\USER}
) i fältet objektnamn och välj OK för att lägga till användaren i policyn. - Välj Avancerat. Välj Hitta nu. Välj användarkontot i listan. Välj OK. Välj OK igen för att lägga till användaren i policyn.
- Skriv användarkontot (
- Välj OK eller Använd för att godkänna ändringarna.
Skapa och hantera Windows-tjänsten
Skapa en tjänst
Använd PowerShell-kommandon för att registrera en tjänst. Kör följande kommandon från ett administrativt PowerShell 6-kommandogränssnitt:
$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}
: Sökvägen till appens körbara fil på värden (till exempeld:\myservice
). Inkludera inte appens körbara filnamn i sökvägen. Ett avslutande snedstreck krävs inte. -
{DOMAIN OR COMPUTER NAME\USER}
: Tjänstanvändarkonto (till exempelContoso\ServiceUser
). -
{SERVICE NAME}
: Tjänstnamn (till exempelMyService
). -
{EXE FILE PATH}
: Appens fullständiga körbara sökväg (till exempeld:\myservice\myservice.exe
). Inkludera den körbara filens namn med filtillägget. -
{DESCRIPTION}
: Tjänstbeskrivning (till exempelMy sample service
). -
{DISPLAY NAME}
: Tjänstvisningsnamn (till exempelMy Service
).
Starta en tjänst
Starta en tjänst med följande PowerShell 6-kommando:
Start-Service -Name {SERVICE NAME}
Kommandot tar några sekunder att starta tjänsten.
Fastställa status för en tjänst
Om du vill kontrollera status för en tjänst använder du följande PowerShell 6-kommando:
Get-Service -Name {SERVICE NAME}
Statusen rapporteras som ett av följande värden:
Starting
Running
Stopping
Stopped
Stoppa en tjänst
Stoppa en tjänst med följande PowerShell 6-kommando:
Stop-Service -Name {SERVICE NAME}
Ta bort en tjänst
Efter en kort fördröjning för att stoppa en tjänst tar du bort en tjänst med följande PowerShell 6-kommando:
Remove-Service -Name {SERVICE NAME}
Scenarier för proxyserver och lastbalanserare
Tjänster som interagerar med begäranden från Internet eller ett företagsnätverk och som finns bakom en proxy eller lastbalanserare kan kräva ytterligare konfiguration. Mer information finns i Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare.
Konfigurera slutpunkter
Som standard binder ASP.NET Core till http://localhost:5000
. Konfigurera URL:en och porten genom att ange miljövariabeln ASPNETCORE_URLS
.
Ytterligare metoder för URL- och portkonfiguration finns i relevant serverartikel:
Föregående vägledning omfattar stöd för HTTPS-slutpunkter. Konfigurera till exempel appen för HTTPS när autentisering används med en Windows-tjänst.
Not
Användning av ASP.NET Core HTTPS-utvecklingscertifikat för att skydda en tjänstslutpunkt stöds inte.
Aktuell katalog och innehållsrot
Den aktuella arbetskatalogen som returneras genom att anropa GetCurrentDirectory för en Windows-tjänst är mappen C:\WINDOWS\system32. Mappen system32 är inte en lämplig plats för att lagra en tjänsts filer (till exempel inställningsfiler). Använd någon av följande metoder för att underhålla och komma åt en tjänsts tillgångar och inställningsfiler.
Använda ContentRootPath eller ContentRootFileProvider
Använd IHostEnvironment.ContentRootPath eller ContentRootFileProvider för att hitta en apps resurser.
När appen körs som en tjänst anger UseWindowsServiceContentRootPath till AppContext.BaseDirectory.
Appens standardinställningsfiler, appsettings.json
och appsettings.{Environment}.json
, läses in från appens innehållsrot genom att anropa CreateDefaultBuilder under värdkonstruktionen.
För andra inställningar som läses in av utvecklarkod i ConfigureAppConfigurationbehöver du inte anropa SetBasePath. I följande exempel finns den custom_settings.json
filen i appens innehållsrot och läses in utan att uttryckligen ange en bassökväg:
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>();
});
}
Försök inte använda GetCurrentDirectory för att hämta en resurssökväg eftersom en Windows Service-app returnerar mappen C:\WINDOWS\system32 som dess aktuella katalog.
Lagra en tjänsts filer på en lämplig plats på disken
Ange en absolut sökväg med SetBasePath när du använder en IConfigurationBuilder till mappen som innehåller filerna.
Felsöka
Information om hur du felsöker en Windows Service-app finns i Felsöka och debugga ASP.NET Core-projekt.
Vanliga fel
- En gammal eller förhandsversion av PowerShell används.
- Den registrerade tjänsten använder inte applikationens publicerade utdata från kommandot dotnet publish. Utdata från kommandot dotnet build stöds inte för appdistribution. Publicerade tillgångar finns i någon av följande mappar beroende på distributionstyp:
- bin/Release/{TARGET FRAMEWORK}/publish (FDD)
- bin/Release/{TARGET FRAMEWORK}/{RUNTIME IDENTIFIER}/publish (SCD)
- Tjänsten är inte i körläge.
- Sökvägarna till resurser som appen använder (till exempel certifikat) är felaktiga. Bassökvägen för en Windows-tjänst är c:\Windows\System32.
- Användaren har inte rättigheter för Logga in som tjänst.
- Användarens lösenord har upphört att gälla eller skickas felaktigt när du kör kommandot
New-Service
PowerShell. - Appen kräver ASP.NET Core-autentisering men är inte konfigurerad för säkra anslutningar (HTTPS).
- Url-porten för begäran är felaktig eller inte korrekt konfigurerad i appen.
System- och programhändelseloggar
Få åtkomst till system- och programhändelseloggarna:
- Öppna Start-menyn, sök efter Händelsevisarenoch välj appen Händelsevisaren.
- I Loggbokenöppnar du noden Windows-loggar.
- Välj System för att öppna systemhändelseloggen. Välj program för att öppna programhändelseloggen.
- Sök efter fel som är associerade med den misslyckade appen.
Kör appen i en kommandotolk
Många startfel ger inte användbar information i händelseloggarna. Du kan hitta orsaken till vissa fel genom att köra appen i en kommandotolk på värdsystemet. Om du vill logga ytterligare information från appen sänker du loggnivå eller kör appen i Utvecklingsmiljö.
Rensa paketcache
En fungerande app kan misslyckas omedelbart efter att ha uppgraderat .NET Core SDK på utvecklingsdatorn eller ändrat paketversioner i appen. I vissa fall kan osammanhängande paket bryta en app vid stora uppgraderingar. De flesta av dessa problem kan åtgärdas genom att följa dessa instruktioner:
Ta bort bin och obj mappar.
Rensa paketcacheminnena genom att köra dotnet nuget locals all --clear från ett kommandogränssnitt.
Du kan också rensa paketcacheminnen med verktyget nuget.exe och köra kommandot
nuget locals all -clear
. nuget.exe är inte en paketerad installation med Windows-skrivbordsoperativsystemet och måste hämtas separat från NuGet-webbplatsen.Återställa och återskapa projektet.
Ta bort alla filer i distributionsmappen på servern innan du distribuerar om appen.
Långsam eller oresponsiv app
En kraschdump är en ögonblicksbild av systemets minne och kan hjälpa dig att fastställa orsaken till en appkrasch, ett startfel eller en långsam app.
Appen kraschar eller stöter på ett undantag
Hämta och analysera en dump från Windows Error Reporting (WER):
Skapa en mapp för att lagra kraschdumpfiler på
c:\dumps
.Kör EnableDumps PowerShell-skriptet med programmets körbara namn:
.\EnableDumps {APPLICATION EXE} c:\dumps
Kör appen under de förhållanden som orsakar kraschen.
När kraschen har inträffat kör du DisableDumps PowerShell-skriptet:
.\DisableDumps {APPLICATION EXE}
När en app kraschar och dumpsamlingen har slutförts kan appen avslutas normalt. PowerShell-skriptet konfigurerar WER för att samla in upp till fem dumpar per app.
Varning
Kraschdumpar kan ta upp en stor mängd diskutrymme (upp till flera gigabyte vardera).
Appen svarar inte, misslyckas vid start eller körs normalt
När en app slutar svara men inte kraschar, misslyckas vid start eller körs normalt kan du läsa User-Mode Dump Files: Välja det bästa verktyget för att välja ett lämpligt verktyg för att skapa dumpen.
Analysera dumpen
En dump kan analyseras med flera metoder. Mer information finns i Analysera en User-Mode dumpfil.
Ytterligare resurser
- Kestrel slutpunktskonfiguration (inkluderar HTTPS-konfiguration och SNI-stöd)
- .NET Generic Host i ASP.NET Core
- Felsöka och avlägsna buggar i ASP.NET Core-projekt
ASP.NET Core