ASP.NET Core 6 アプリケーションを Windowsのサービスとして実行する - ASP.NET

ASP.NET Core 6 アプリケーションを Windowsのサービスとして配置、実行する手順を紹介します。

概要

こちらの記事では、ASP.NET Core 6アプリケーションをIISのWebサーバーに配置して実行する手順を紹介しました。 ASP.NET Core アプリケーションはIISに配置して実行する以外に、Windowsのサービスとして実行する方法もあります。 この記事では、ASP.NET Core 6 アプリケーションをWindowsのサービスとして配置する手順を紹介します。

アプリケーションの作成

サービスとして実行するASP.NET Coreのアプリケーションを作成します。
ASP.NET Coreの空アプリケーションを作成します。

Microsoft.Extensions.Hosting.WindowsServicesのインストール

Microsoft.Extensions.Hosting.WindowsServices をインストールします。
NuGetパッケージマネージャーで次のコマンドを実行します。
NuGetパッケージマネージャーでのインストール手順は こちらの記事を 参照してください。

Install-Package Microsoft.Extensions.Hosting.WindowsServices -Version 6.0.0

コード

Program.csファイルのコードを以下に変更します。
Progarm.cs
using Microsoft.Extensions.Hosting.WindowsServices;

var webApplicationOptions = new WebApplicationOptions {
  ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default,
  Args = args,
};

var builder = WebApplication.CreateBuilder(webApplicationOptions);
builder.Host.UseWindowsService();

var app = builder.Build();
app.MapGet("/", () => "Hello ASP.NET Core World!");

app.Run();

解説

実行マシンへの.NETランタイムのインストール

サービスとしてASP.NET Core アプリケーションを稼働するマシンに、.NETランタイムをインストールします。 インストールするラインタイムはASP.NET Windows Hosting Bundleになります。 .NET 6の場合のインストール手順はこちらの記事を参照してください。

サービスアカウントの作成

サービスアカウントの作成をします。アカウントの作成はこちらの記事を参照してください。 また、作成したアカウントをサービスアカウントとして設定する必要があります。 サービスアカウントに設定する手順はこちらの記事を参照してください。

今回の例では MyTestServiceアカウントを作成しました。マシン名はkousa としていますので、 マシン名まで含めたアカウント名は kouksa\MyTestService アカウントとなります。

アプリケーションの配置

プロジェクトの発行でフォルダーに発行します。手順についてはこちらの記事を参照してください。


発行したファイルをインストール先のマシンに配置します。今回の例ではC:\app\MyTestService\ に配置しています。

サービスの作成

サービスを作成するためのPowerShellスクリプトを用意します。
ps1ファイルを作成し下記のコードを記述します。
create-my-service.ps1
$acl = Get-Acl "C:\app\MyTestService"
$aclRuleArgs = "kousa\MyTestService", "Read,Write,ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow"
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule($aclRuleArgs)
$acl.SetAccessRule($accessRule)
$acl | Set-Acl "C:\app\MyTestService\SimpleServiceHostingApp.exe"

New-Service -Name MyTestService -BinaryPathName "C:\app\MyTestService\SimpleServiceHostingApp.exe" -Credential "kousa\MyTestService" -Description "MyTestServiceのサービス" -DisplayName "MyTestService" -StartupType Automatic

コマンドを実行します。サービスが作成され、下図の画面が表示されます。

補足:sc.exeを利用する場合
sc.exe コマンドを利用してサービスを作成する場合は、以下のコマンドを実行します。
sc.exe create MyTestService binpath= C:\app\MyTestService\SimpleServiceHostingApp.exe type= own obj= kousa\MyTestService password= (MyTestServiceアカウントのパスワード) start= auto

PowerShellの場合と異なりアクセス権は設定されないため、サービスアカウントにアプリケーションの実行アクセス権を付与します。

サービスの起動

コンピューターの管理を開き、サービス一覧画面を表示します。先ほど作成したサービス(MyTestService)が一覧に追加されていることを確認します。


サービスは停止していますので、サービスを起動します。MyTestServiceの項目をクリックして選択し、右クリックします。 下図のポップアップメニューが表示されますので、[開始]の項目をクリックします。


サービスが開始できると[状態]の欄が"実行中"の表示に変わります。


PowerShellコマンドで実行する場合
PowerShellのコマンドでサービスを起動する場合は次のコマンドを実行します。
 Start-Service -Name MyTestService

動作確認

サービスとしてASP.NET Coreアプリケーションが起動しているか確認します。Webブラウザを開き http://localhost:5000 にアクセスします。 サービスが実行できていれば、下図のページが表示されます。ASP.NET Coreアプリケーションが実行でき、実装したレスポンスが返ることが確認できます。

次の手順

ローカルマシンから動作の確認ができましたが、外部のマシンからの接続はまだできない状態です。
外部からアクセスできるようにするための設定をします。 手順の詳細はこちらの記事を参照してください。

参考:サービスの削除

オプションを間違えてサービスを作成してしまった場合、いったんサービスを削除した後に、再度サービスを作成する必要があります。 サービスを削除するスクリプトファイルを準備しておきます。
ps1ファイルを作成し、下記のコードを記述します。

Remove-Serviceコマンドレットがない場合は、sc.exeを実行してサービスを削除します。sc.exeでサービスを削除するスクリプトは以下です。
remove-my-service.ps1
sc.exe delete "MyTestService"

Remove-Serviceコマンドレットが利用できる場合は、下記コマンドでサービスの削除ができます。
remove-my-service.ps1
Remove-Service -Name "MyTestService"

著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
最終更新日: 2023-09-17
作成日: 2022-07-03
iPentec all rights reserverd.