Запуск приложения как службу в Windows. FAILED 1053

Собрал приложение, руководствуясь данным туториалом. Запускается и все хорошо работает.

Перенес приложение на сервер. Поскольку я собирал приложение через Publish в Visual Studio с указанием, что хочу иметь один файл, поэтому я переношу три файла .exe, .pdb, settings.json.

Через sc, как указано в руководстве создаю службу

.\sc.exe create "service1" binpath="C:\path\to\publish\service.exe"

И запускаю на сервере

.\sc.exe start "service1"

Получаю ошибку

[SC] StartService FAILED 1053: 

The service did not respond to the start or control request in a timely fashion. windows server

Понятное дело, поискал и вот, что перепробовал:

  1. Манипуляции с ServicesPipeTimeout-ключом в регистре
  2. Проверены версии .NET и Runtime с ними
  3. Обновление системы

Дайте подсказку, как отловить то, что мешает запуску?

Приложение для .NET 6.0, C#, Windows Server 2019

Program.cs

using CsvToDdWorker;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;

using IHost host = Host.CreateDefaultBuilder(args)
    .UseWindowsService(options =>
    {
        options.ServiceName = "service1";
    })
    .ConfigureServices(services =>
    {
        LoggerProviderOptions.RegisterProviderOptions<
            EventLogSettings, EventLogLoggerProvider>(services);

        services.AddSingleton<SendToDbService>();
        services.AddHostedService<WindowsBackgroundService>();
    })
    .ConfigureLogging((context, logging) =>
    {
        logging.AddConfiguration(
            context.Configuration.GetSection("Logging"));
    })
    .Build();

await host.RunAsync();

WindowsBackgroundService.cs

namespace CsvToDdWorker
{
    public class WindowsBackgroundService : BackgroundService
    {
        private readonly SendToDbService _sendService;
        private readonly ILogger<WindowsBackgroundService> _logger;

        public WindowsBackgroundService(
            SendToDbService sendService,
            ILogger<WindowsBackgroundService> logger) =>
            (_sendService, _logger) = (sendService, logger);

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            try
            {
                while (!stoppingToken.IsCancellationRequested)
                {
                    _sendService.SendToDb(_logger);
                    await Task.Delay(TimeSpan.FromMinutes(20), stoppingToken);
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "{Message}", ex.Message);
                Environment.Exit(1);
            }
        }
    }
}

UPD

Попробовал так же поиграться с периодом запуска приложения. Изменял на секунды, минуту, час. Дело не в этом.

UPD1

Запустил исполнение на сервере без службы функцию SendToDb(_logger). на прямую через dotnet run. Она работает без проблем.


Ответы (1 шт):

Автор решения: Dmitry

На самом деле ошибка, которая указана в вопросе очень широкая. Описание, которое прилагается к исключению совсем не несет никакого смысла, вот это

[SC] StartService FAILED 1053: 

The service did not respond to the start or control request in a timely fashion. windows server

Что удалось выяснить:

  1. Моя проблема заключалась в невнимательности при следовании инструкции. В Publish-рутине в окне всех настроек Deployment mode -> Self-contained забыл указать.
  2. Ошибки, исключения в самой логике приложения никак не влияют на появление данной проблемы. Я инсценировал проблемы, собирал и запускал. Да, приложение крашится, но не в момент запуска службы, а в момент исполнения. И совсем другие коды ошибок.
→ Ссылка