Подтвердить что ты не робот

Ошибка 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();
    }
}
4b9b3361

Ответ 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