web-dev-qa-db-ja.com

エラー1053サービスは開始または制御要求に応答しませんでした

私は基本的に、毎分データベースで注文をチェックし、これらの注文からPDFを生成し、それを電子メールで送信するWindowsサービスをC#で作成しました。

ロジックは私のテストなどで完全に機能します。

サービスを作成し、セットアッププロジェクトを使用してインストールすると、サービスmmcでサービスを開始すると、次のようになります。

エラー1053サービスは、開始要求または制御要求にタイムリーに応答しませんでした

私のOnStartメソッドは次のようになります。

protected override void OnStart(string[] args)
{
    //writeToWindowsEventLog("Service started", EventLogEntryType.Information);
    timer.Enabled = true;
}

基本的には、タイマーを有効にするだけです...そのため、プロセスを集中的に呼び出すことはありません。

どこがおかしいの?

スタートアップアカウントをローカルシステム、ネットワークサービスなどに設定しようとしましたが、何も機能しません!

編集:

ここに私のコードがあります:(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();
    }
}
36
Alex

[〜#〜] msdn [〜#〜] から:
"OnStartにある処理を実行するためにコンストラクターを使用しないでください。OnStartを使用してサービスのすべての初期化を処理します。コンストラクターは、サービスの実行時ではなく、アプリケーションの実行可能ファイルの実行時に呼び出されます。 OnStart。たとえば、続行すると、SCMが既にオブジェクトをメモリに保持しているため、コンストラクターは再度呼び出されません。OnStopがOnStartではなく、コンストラクターに割り当てられたリソースを解放する場合、必要なリソースは2回目に作成されません。サービスが呼び出されます。」

OnStart呼び出しでタイマーが初期化されていない場合、これは問題である可能性があります。また、タイマーのタイプをチェックし、System.Timers.Timer for Servicesであることを確認します。 ここ は、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);
        }
    }
}
27
SwDevMan81

私はちょうど同じ問題を抱えていました。

それは、デバッグモードでコンソールとして実行していたためでした-上記のコードのように

#if (!DEBUG)

#else //debug code

#endif

そして、私はそれをデバッグモードでコンパイルし、サービスをインストールしていました

リリースモードでコンパイルしたとき、期待どおりに動作しました

お役に立てれば

28
ChrisCa

将来、他の誰かがこれに遭遇した場合、Windows Server 2012でWindowsサービスを開始しようとしたときに同じエラー1053を受け取りました。

問題は、サービスが.NETフレームワーク4.5.1を対象に開発されたが、Windows Server 2012インスタンスにはそのバージョンの.NETフレームワークがインストールされていないということでした。サービスをターゲット.NET 4.0にバックアップすると、エラーが修正されました。

11
Aaron

コンストラクターが問題でした。コンストラクターは、欠落しているDLLについて例外をスローしている必要があります。

私の問題:インストーラーの作成に関する経験不足。依存DLLをインストールフォルダーにコピーしていません(プライマリプロジェクト出力を作成するときにリリースビルド構成を選択する必要がありました)。

2
AndyClaw

これは私のために働いた。基本的に、ログオンユーザーが正しいユーザーに設定されていることを確認します。ただし、アカウントインフラストラクチャの設定方法によって異なります。私の例では、ADアカウントのユーザー資格情報を使用しています。

起動メニューで「サービス」を検索します-サービスで必要なサービスを見つけます-右クリックして「ログオン」タブを選択します-「アカウント」を選択し、必要なコンテンツ/資格情報を入力します-通常どおりサービスを開始します

enter image description here

2
d689p

サーバーコンソール(サーバールーム)に移動し、そこからサービスを開始します。リモートで動作しません。

1
vnRock

また、.configファイルに余分な「>」文字があることが判明するまで、このエラーが発生していました。

そのため、コンピューターをパンチする前に、まず.configファイルを再確認してください;)

1
SyntaxError

サービスの名前が実際の.exeファイル名と異なる場合、同じフォルダーにあるサービスと同じ名前の.exeがないことを確認してください。これにより、サービスが失敗します。

私の状況では、「Index Reader service.exe」を指す「Index Reader」というサービスと、同じフォルダー内の「Index reader.exe」というexeがありました。これを削除すると、問題が修正されました。

enter image description here

enter image description here

0
David Lindon

私の場合; .Net 3.5サービスをWindows 2012サーバーにインストールしようとしていました。サーバーに.Net 4.0フレームワークがインストールされました。

サービスのターゲットフレームワークを.Net 4.0に変更します。今では正常に動作します。

0
Orcun

私は同じ問題を抱えていましたが、私の場合は、リリース時にインストーラーサービスを再構築しました。サービスを再度インストールして実行すると、問題なくサービスが実行を開始しました

0
Misha Beskin

私のような。 4.6.1では動作しません(同じメッセージが表示されます)。その後、4.5で試して問題なく動作します。

0
Ruben Collazos

サービスを含むアセンブリから最初に実行されるのは、 Main methodです。そして、特別なアクション、またはそのようなアクションを少なくとも1つ実行する必要があります。

public static int Main()
{
  Run(new System.ServiceProcess.ServiceBase[] { new YourServiceClass() });
}

これが、最初のサービスを作成するときに試行錯誤を繰り返した後に発見したものです。 VSは使用しませんでした。私はVSガイドを使用しました( ウォークスルー:コンポーネントデザイナーでのWindowsサービスアプリケーションの作成 )、私はむしろこれを使用する必要があります: C#サービスの作成手順:レッスンI

適切な「メイン」メソッドがないと、実行可能ファイルはすぐに終了し、システムは30秒のタイムアウトを超えたと報告します:)

0
Jarekczek