https://learn.microsoft.com/ko-kr/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-9.0&tabs=visual-studio
Windows 서비스에서 ASP.NET Core 호스트
Windows 서비스에서 ASP.NET Core 앱을 호스트하는 방법을 알아봅니다.
learn.microsoft.com
Windows 서비스에서 ASP.NET Core 호스트 페이지 참고
프로젝트 생성
dotnet new worker -o ContosoWorker
Worker.cs
namespace ContosoWorker;
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
private readonly string _logFile;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
_logFile = Path.Combine(Path.GetTempPath(), "ContosoWorker.log");
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await LogAndWriteAsync("Worker is starting.", stoppingToken);
while (!stoppingToken.IsCancellationRequested)
{
var timestamp = DateTimeOffset.Now;
await LogAndWriteAsync($"Worker running at: {timestamp}", stoppingToken);
await Task.Delay(5000, stoppingToken);
}
}
private async Task LogAndWriteAsync(string message, CancellationToken cancellationToken)
{
_logger.LogInformation(message);
await File.AppendAllTextAsync(_logFile, message + Environment.NewLine, cancellationToken);
}
}
Program.cs
using ContosoWorker;
var builder = Host.CreateApplicationBuilder(args);
// Windows Service 등록 (중요)
builder.Services.AddWindowsService(options =>
{
options.ServiceName = "Contoso Worker";
});
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
빌드
dotnet publish -c Release -r win-x64 --self-contained true /p:PublishSingleFile=true
관리자 권한으로 서비스 생성
sc.exe create ContosoWorker binPath="D:\Learn\c#\ContosoWorker\bin\Release\net9.0\win-x64\publish\ContosoWorker.exe"
서비스 시작
Start-Service -Name ContosoWorker
로그확인 : C:\Windows\SystemTemp\ContosoWorker.log
Worker is starting.
Worker running at: 2025-09-15 오후 3:05:50 +09:00
Worker running at: 2025-09-15 오후 3:05:55 +09:00
Worker running at: 2025-09-15 오후 3:06:00 +09:00
Worker running at: 2025-09-15 오후 3:06:05 +09:00
Worker running at: 2025-09-15 오후 3:06:10 +09:00
Worker running at: 2025-09-15 오후 3:06:15 +09:00
Worker running at: 2025-09-15 오후 3:06:20 +09:00
Worker running at: 2025-09-15 오후 3:06:25 +09:00
Worker running at: 2025-09-15 오후 3:06:30 +09:00
Worker running at: 2025-09-15 오후 3:06:35 +09:00
Worker running at: 2025-09-15 오후 3:06:40 +09:00
Worker running at: 2025-09-15 오후 3:06:45 +09:00
Worker running at: 2025-09-15 오후 3:06:51 +09:00
Worker running at: 2025-09-15 오후 3:06:56 +09:00
윈도우 이벤트에는 기록되지 않는다.
참고 서비스 삭제
$serviceName = "ContosoWorker"
Stop-Service -Name $serviceName -Force -ErrorAction SilentlyContinue
sc.exe delete $serviceName
# 레지스트리 확인 및 강제 삭제
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\$serviceName"
if (Test-Path $regPath) {
Remove-Item -Path $regPath -Recurse -Force
}