Ошибка 1053, служба не ответила на запрос запуска или управления
Я написал службу Windows на С#, которая в основном проверяет мой db каждую минуту для заказов, генерирует PDF из этих заказов и отправляет его по электронной почте.
Логика отлично работает в моих тестах и т.д.
Когда я создаю службу и устанавливаю ее с помощью проекта установки, когда я иду для запуска службы в сервисах mmc, я получаю:
ошибка 1053 служба не ответила на запрос запуска или управления своевременно
Мой метод OnStart выглядит следующим образом:
protected override void OnStart(string[] args)
{
//writeToWindowsEventLog("Service started", EventLogEntryType.Information);
timer.Enabled = true;
}
В принципе, просто включает таймер... так что там нет интенсивного процесса.
Где я иду не так?
Я попытался настроить учетную запись запуска на локальную систему, службу сети и т.д.... ничего не работает!
Edit:
Вот мой код: (processPurchaseOrders - это метод, в котором запрашивается db, и PDF генерируются и т.д.)
public partial class PurchaseOrderDispatcher : ServiceBase
{
//this is the main timer of the service
private System.Timers.Timer timer;
public PurchaseOrderDispatcher()
{
InitializeComponent();
}
// The main entry point for the process
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() };
ServiceBase.Run(ServicesToRun);
#else //debug code
PurchaseOrderDispatcher service = new PurchaseOrderDispatcher();
service.processPurchaseOrders();
#endif
}
private void InitializeComponent()
{
this.CanPauseAndContinue = true;
this.ServiceName = "Crocus_PurchaseOrderGenerator";
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
//turn off the timer.
timer.Enabled = false;
}
protected override void OnPause()
{
timer.Enabled = false;
base.OnPause();
}
protected override void OnContinue()
{
timer.Enabled = true;
base.OnContinue();
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
processPurchaseOrders();
}
}
Ответы
Ответ 1
От MSDN:
"Не используйте конструктор для выполнения обработки, которая должна быть в OnStart. Используйте OnStart для обработки всей инициализации вашей службы. Конструктор вызывается, когда выполняется исполняемый файл приложения, а не при запуске службы. Исполняемый файл выполняется до OnStart. например, конструктор не вызывается снова, потому что SCM уже содержит объект в памяти. Если OnStop освобождает ресурсы, выделенные в конструкторе, а не в OnStart, необходимые ресурсы не будут создаваться снова во второй раз, когда вызывается служба".
Если ваш таймер не инициализирован в вызове OnStart, это может быть проблемой.
Я бы также проверил тип таймера, убедитесь, что его System.Timers.Timer для служб. Здесь приведен пример настройки таймера в службе Windows.
//TODONT: используйте службу Windows только для запуска запланированного процесса
Я попробовал ваш код, и все выглядит нормально. Единственное различие, которое у меня было, это записать код таймера (Service1.cs). Дайте мне знать, не работает ли ниже.
Service1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Timers;
using System.Threading;
namespace WindowsServiceTest
{
public partial class Service1 : ServiceBase
{
private System.Timers.Timer timer;
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
timer.Enabled = false;
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
//var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
double timeInSeconds = 3.0;
timer.Interval = (timeInSeconds * 1000);
// timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
int timer_fired = 0;
}
}
}
Service1.Designer.cs
namespace WindowsServiceTest
{
partial class Service1
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components = new System.ComponentModel.Container();
this.ServiceName = "Service1";
this.CanPauseAndContinue = true;
}
#endregion
}
}
Я только что создал пустой проект службы Windows и добавлю ниже, чтобы я мог запустить installutil.exe и приложить к рассмотренному выше, чтобы узнать, стреляло ли событие (и это было).
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using System.ServiceProcess;
namespace WindowsServiceTest
{
[RunInstaller(true)]
public class MyServiceInstaller : System.Configuration.Install.Installer
{
public MyServiceInstaller()
{
ServiceProcessInstaller process = new ServiceProcessInstaller();
process.Account = ServiceAccount.LocalSystem;
ServiceInstaller serviceAdmin = new ServiceInstaller();
serviceAdmin.StartType = ServiceStartMode.Manual;
serviceAdmin.ServiceName = "Service1";
serviceAdmin.DisplayName = "Service1 Display Name";
Installers.Add(process);
Installers.Add(serviceAdmin);
}
}
}
Ответ 2
У меня была такая же проблема.
Оказалось, что это было потому, что я запускал его как консоль в режиме отладки - например, код, который у вас выше
#if (!DEBUG)
#else //debug code
#endif
И я скомпилировал его в режиме отладки и установил службу
Когда я скомпилировал его в режиме выпуска, он работал как ожидалось
Надеюсь, что это поможет
Ответ 3
В случае, если кто-то еще столкнется с этим в будущем, я получил ту же ошибку 1053 при попытке запустить мою службу Windows в Windows Server 2012.
Проблема заключалась в том, что сервис был разработан с таргетингом на .NET framework 4.5.1, но в экземпляре Windows Server 2012 не было установлена эта версия платформы .NET. Резервное копирование службы до целевого .NET 4.0 исправило ошибку.
Ответ 4
Это сработало для меня. В основном убедитесь, что пользователь Log on установлен вправо. Однако это зависит от того, как настроена инфраструктура учетной записи. В моем примере он использует учетные данные пользователя учетной записи AD.
В окне поиска в меню поиска найдите "Услуги",
-Инвестиции найдут требуемый сервис
щелкните правой кнопкой мыши и выберите вкладку "Вход в систему"
-Выберите "Эта учетная запись" и введите требуемый контент/учетные данные
-Откройте его и запустите сервис как обычно.
![введите описание изображения здесь]()
Ответ 5
Я иду на консоль сервера (в серверной комнате) и запускаю службу оттуда. Удаленная работа не работает.
Ответ 6
Конструктор был для меня проблемой. Конструктор, должно быть, выбрасывал пропущенные библиотеки DLL.
Моя проблема: моя неопытность в создании инсталляторов. У меня не было зависимых библиотек DLL, скопированных в папку установки (мне нужно было выбрать конфигурацию сборки выпуска при создании первичного выходного файла проекта).
Ответ 7
Также была эта ошибка, пока я не узнал, что в моем файле .config имеется избыточный символ " > ".
Итак, попробуйте дважды проверить файл .config перед тем, как перфорировать ваш компьютер;)
Ответ 8
В моем случае; Я пытался установить службу .Net 3.5 на сервер Windows 2012. На сервере была установлена инфраструктура .NET 4.0.
Я меняю целевую структуру службы на .Net 4.0. Теперь он отлично работает.
Ответ 9
Первое, что выполняется из сборки, содержащей сервис, - это Основной метод. И он должен предпринять специальные действия или хотя бы одно такое действие:
public static int Main()
{
Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() });
}
Это то, что я обнаружил после сеансов испытаний и ошибок при создании моей первой службы. Я не использовал VS. Я использовал VS-руководство (Пошаговое руководство: создание приложения-службы Windows в конструкторе компонентов), хотя я должен использовать его: Создание службы С# Шаг за шагом: Урок I.
Без подходящего метода "Main" исполняемый файл сразу заканчивается, и системные отчеты превышают 30 секунд:)
Ответ 10
Как и я. В 4.6.1 не работают (у меня такое же сообщение).
Затем я пытаюсь выполнить 4.5 и работать нормально.
Ответ 11
Если ваше имя службы отличается от фактического имени файла.exe, убедитесь, что у вас нет файла.exe с тем же именем, что и служба, расположенная в той же папке, которая приведет к сбою.
В моей sitatuation у меня была служба под названием "Index Reader", указывающая на "Index reader service.exe", а в той же папке - exe, называемой "Index reader.exe". Устранение этого устранило проблему.
![enter image description here]()
![enter image description here]()