single.php

C# ASP.NET Webの実行ファイルがサービス開始に失敗する場合の対処法

Visual StudioでASP.NET Webプロジェクトで出力される実行可能ファイル(拡張子 .exe)をWindowsサービスから実行した場合に開始に失敗する場合の対処法を備忘録的に投稿します。

Windows サービス化

ASP.NET Web プロジェクトをビルドした際に出力される実行ファイル。

管理権限で[PowerShell(またはコマンドプロンプト]に、指定したフォルダーに作成された実行ファイル(拡張子 .exe)の場所を含めて、サービス登録のコマンドを実行するとWindowsサービスとして登録可能です。

sc create <サービス名> binPath="[発行]画面で指定した実行ファイル(.exe)の場所"

しかし、サービスを開始すると[エラー 1053: そのサービスは指定時間内に開始要求または削除要求に応答しませんでした。]が表示されます。

NuGet パッケージが必要

実行環境がWindowsであれば、NuGet パッケージを追加して[Program.cs]を編集してWindows サービス化が可能です。

具体的には次の手順で行います。

1.[ソリューション エクスプローラー]で[NuGet パッケージの管理]メニューで[Microsoft.Extensions.Hosting.WindowsServices]をインストールします。

2. プロジェクトに新しく[Worker]クラスファイルを追加します。

3. 追加した[Worker.cs]ファイルを編集します。

using System.Diagnostics;

namespace StreamDeck
{
  public class Worker : BackgroundService
  {
    private readonly ILogger<Worker> _logger;
    public Worker(ILogger<Worker> logger)
    {
      _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
      while (!stoppingToken.IsCancellationRequested)
      {
        if (_logger.IsEnabled(LogLevel.Information))
        {
          _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
        }
        await Task.Delay(1000, stoppingToken);
      }
    }
  }
}

4. [Program.cs]ファイルを編集して太字の部分を追加します。

using StreamDeck;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHostedService<Worker>();
builder.Services.AddWindowsService();

// Add services to the container.
builder.Services.AddRazorPages();

builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
    options.Cookie.Name = ".StreamDeck.Session";
    options.IdleTimeout = TimeSpan.FromHours(1);
    options.Cookie.IsEssential = true;
});

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.UseSession();

app.MapRazorPages();

app.Run();

5. プロジェクトを保存してビルドを行います。

6. ビルド後にサービス登録を行い[開始]操作を行います。

エラー画面が表示されずにサービスの状態が[開始]になれば、Windowsサービスとして動作します。

まとめ

Visual StudioでASP.NET Webプロジェクトで出力される実行可能ファイル(拡張子 .exe)をWindowsサービスから実行した場合に開始に失敗する場合の対処法について書きました。

ググってみると、そのままサービス登録して開始できる記事も散見されましたが実際にはNuGet パッケージのインストールや[Program.cs]の編集が必要でした。

特に、[AddWindowsService]メソッド(または[UseWindowsService]メソッド)を追加していないと登録したサービスを開始できない可能性があります。

ASP.NET Webプロジェクトで出力される実行可能ファイル(拡張子 .exe)をWindowsサービスから利用したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です