2

Visual Studioのプロジェクトから実行可能ファイルを作成してサービスを作成したいのですが(コンソールウィンドウを必要とせずに実行できます)。Windowsサービス(Visual Studioで作成したexe)を起動するとエラー1053が発生する

sc create MY.SERVICE binpath= "C:\Program Files\Project\serviceProj\myService.exe 

サービスは、期待どおりにWindowsサービスマネージャー内に表示されます。しかし、私はサービスを開始しようとするたびに、それは約2秒後に失敗し、私は次のエラーを与える:

Windows could not start the MY.SERVICE on Local Computer. 
Error 1053: The service did not respond to the start or control request in a timely fashion. 

私が行っているもの:Visual Studioの

にリリースするデバッグから変更

すべてを管理者として実行します(サービスの作成、プロジェクトの公開、サービスの開始など)。

また、サービスマネージャがサービスの開始を待つ時間が長くなることもあります。私はちょうどそれを行うためにWindowsレジストリ値を追加しましたが、残念ながらそれは動作しませんでした。コマンドプロンプトからサービスを開始し

は通常のみ起動し、私は何が起こっているかが不明だよう要求をリッスンを開始するために2-3秒かかります。

何か助けていただければ幸いです。ここで

は私のStartup.csクラスです:

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Logging; 
using Newtonsoft.Json.Serialization; 
using Microsoft.AspNetCore.Hosting.WindowsServices; 
using System.Diagnostics; 
using System.IO; 
using Serilog; 
using System.Linq; 

namespace My.Service 
{ 
    public class Startup 
    { 
     public static void Main(string[] args) 
     { 
      var exePath = Process.GetCurrentProcess().MainModule.FileName; 
      var directoryPath = Path.GetDirectoryName(exePath); 

      if (Debugger.IsAttached || args.Contains("--debug")) 
      { 
       var host = new WebHostBuilder() 
        .CaptureStartupErrors(true) 
        .UseKestrel() 
        .UseUrls("http://localhost:5002") 
        .UseContentRoot(Directory.GetCurrentDirectory()) 
        .UseIISIntegration() 
        .UseStartup<Startup>() 
        .Build(); 
       host.Run(); 
      } 
      else 
      { 
       var host = new WebHostBuilder() 
        .UseKestrel() 
        .UseUrls("http://localhost:5002") 
        .UseContentRoot(directoryPath) 
        .UseIISIntegration() 
        .UseStartup<Startup>() 
        .Build(); 
       host.RunAsService(); 
      } 
     } 


     public Startup(IHostingEnvironment env) 
     { 
      //Setup Logger 
      Log.Logger = new LoggerConfiguration() 
       .WriteTo.Trace() 
       .MinimumLevel.Debug() 
       .CreateLogger(); 
      // Set up configuration sources. 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json"); 
      Configuration = builder.Build(); 
     } 

     public IConfigurationRoot Configuration { get; set; } 

     // This method gets called by the runtime. Use this method to add services to the container. 
     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddMvc().AddJsonOptions(options => 
      { 
       options.SerializerSettings.ContractResolver = 
        new CamelCasePropertyNamesContractResolver(); 
      }); 
     } 

     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime lifetime) 
     { 
      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 
      else 
      { 
       app.UseExceptionHandler("/Home/Error"); 
      } 

      app.UseStaticFiles(); 

      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}"); 
      }); 
     } 
    } 
} 
+0

サービスに関するもう少し詳しくお聞かせください。 OnStartイベントハンドラは、できるだけ早く作業を完了して終了する必要があります.30秒未満で実行する必要があります。 OnStartハンドラで長時間実行されているタスクを実行していますか?おそらく少しコードを投稿しますか? – STLDeveloper

+0

@STLDeveloper OnStartイベントハンドラがありません。元の投稿に追加したStartup.csクラスがあります。以前はWindowsサービスを作成したことはありません。オンラインで見たものから、実行可能ファイルからWindowsサービスを作成することは可能です。 – Roka545

+1

可能ですが、アプリケーションの構造に関して非常に特定のガイドラインに従わなければなりません。 – STLDeveloper

答えて

2

あなたが見ているエラーは(あなたが始めたサービスは、妥当な時間内にその起動を完了していないことのWindowsからの通知です30秒)。

あなたは、Windowsのサービスのために欲しいものではありません、あなたのアプリの公開main()メソッドに詰め、あなたのサービスのためのロジックを持っているので、これが起こっています。

Windowsサービスには、サービスをサポートするための少しの構造が含まれています。通常、サービスのMain()で発生するのは、サービスをロードすることですが、実際にはサービスを起動することはありません。このサービスには、開始、停止、一時停止、継続、およびシステムの停止時などの標準サービスアクションへの応答をサポートするイベントハンドラが含まれています。

すべてのWindowsサービスが持つこの構造は、少し複雑で、オペレーティングシステムの仕様に合わせて構築する必要があります。 Windowsサービスを手動で構築することは可能ですが、すべての配管を正確にするのは難しいので、ここでVisual Studioで手助けするのはずっと簡単です。

Windowsサービスを構築する最も単純で最も直接的なアプローチはVSはあなたが新しいVisual Studioプロジェクトを作成するときのWindowsサービスプロジェクトを作成できるようにすることです。新しいプロジェクトには、必要なすべての必要な配管およびサービス機能が含まれています。

もちろん、手動でサービスを構築することはできますが、本当に理由はありません。あなたが手作業で構築したパスを下ろす必要がある場合は、少なくとも以下のアクションを実行する必要があります(1つの注意点 - 私はこれをメモリから行いますが、VS 2017に戻っていますので、 ):

  • プロジェクトにWindowsサービスコンポーネントを追加します。これを行うには、ソリューションエクスプローラでプロジェクトを右クリックし、[追加]を選択します。メニューが表示されたら、「コンポーネント...」を選択します。表示されるダイアログで、「Windowsサービス」を選択します。アドバイスの言葉は、 "Add"ボタンを押す前にファイルに意味のある名前をつけてください。

  • Windowsサービスコンポーネントが追加されたら、それを右クリックしてプロパティを設定します。

  • OnStart、OnStop、OnPause、OnContinue、およびOnShutdownイベントハンドラをプログラミングするには、Windowsサービスデザインスペースを右クリック(またはソリューションエクスプローラでファイルを右クリック)し、[コードの表示]を選択します。

Windowsサービスの構築については、ここには余裕がないことがたくさんあります。私は、あなたがこの分野で多くを行う前に、その問題に関するいくつかの良い文書を探し、それを勉強することをお勧めします。ここで間違っていると、あなたのサービスを実行しているマシンにかなり大きな影響を及ぼす可能性があります。 MSDN: Walkthrough: Creating a Windows Service Application in the Component Designerをご覧ください。これはこれをもっと徹底的に説明するのに役立ちます。

0

イベントビューアを開いて、受信したエラーに関する詳細情報を取得しました。私はエラーを引き起こしていたFileNotFoundExceptionを受け取りました。これは、Visual Studioやコマンドラインからサービスを実行すると完全に正常に動作するので、私は驚いています。ファイルが見つかりました。問題のファイルは、作業ディレクトリにあります。私はFile.OpenTextメソッドに相対パスを使用せずにファイルへのパスをハードコードしていました。したがって、何らかの理由でWindowsサービスの相対パスが機能していません。

関連する問題