Служба Windows застряла в статусе "запуска" как локальная системная учетная запись

Я разработал HTTP-сервер через консольное приложение на С# и решил превратить его в службу Windows, чтобы иметь возможность инициализировать его без необходимости входа в систему.

Я выполнил все шаги в Как создать службу Windows и выбрал учетную запись как "Локальная система", но когда я устанавливаю на своем сервере машина и нажмите кнопку запуска, она занимает некоторое время и дает следующую ошибку:

Erro 1053: служба не ответила на запрос запуска или управления своевременно.

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

Попытка обойти эту проблему, я изменил ее на "Network Service", поэтому она началась нормально, но приложение не прослушивалось в порту, который я установил, когда я проверил в приглашении команду "netstat -an". Но приложение нормально слушает, если я запускаю его как консольное приложение.

Итак, я ищу ответ на один из этих двух вопросов:

  • Что делать, чтобы служба запускалась правильно с учетной записью Local System?
  • Если я решаю использовать учетную запись сетевой службы, что я должен заботиться о том, чтобы моя служба работала правильно как сервер?

Ответ 1

Когда я преобразовал консольное приложение в службу Windows, я просто поместил свой код непосредственно в метод OnStart. Тем не менее, я понял, что метод OnStart должен запустить службу, но для завершения службы нужно положить конец некоторому времени. Поэтому я создал поток, который запускает мой сервис, и пусть метод OnStart закончен. Я тестировал, и сервис работал нормально. Вот как это был код:

protected override void OnStart(string[] args)
{
    Listener(); // this method never returns
}

Вот как это работает:

protected override void OnStart(string[] args)
{
    Thread t = new Thread(new ThreadStart(Listener));
    t.Start();
}

Но я все еще не понимаю, почему служба запускалась (передавала статус "start", но не работала), когда я использовал учетную запись сетевой службы. Если кто-нибудь знает, я буду рад узнать причину.

Ответ 2

Проверьте журнал событий приложения Windows, он может содержать некоторые записи из вашего автоматически генерируемого источника событий службы (который должен иметь одно и то же имя службы).

Ответ 3

Вы можете попытаться увеличить тайм-аут службы Windows с помощью ключа в реестре

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control

"ServicesPipeTimeout" = dword: 300000 (30 секунд)

Если он не существует, он должен быть создан.