Windowsサービスとしての.NET Core Worker

.NET Core 3.0では、ワーカーサービスと呼ばれる新しいタイプのアプリケーションテンプレートを導入しています。 このテンプレートは、.NET Coreで長時間実行されるサービスを作成するための出発点を提供するように設計されています。 このチュートリアルでは、ワーカーを作成し、Windowsサービスとして実行します。













作成ワーカー



ご注意 プレリリースバージョンでは、ワーカーテンプレートはWebテンプレートと同じメニューにあります。 これは将来のリリースで変更されます。 新しいプロジェクトを作成するために、ウィザードにワーカーサービステンプレートを直接配置する予定です。







Visual Studioでワーカーを作成する



画像







画像







画像







コマンドラインでワーカーを作成する



dotnet new worker



実行します







画像







Windowsサービスとして実行



Windowsサービスとして開始するには、ワーカーがServiceBase



.NETタイプからの開始信号と停止信号を確認し、Windowsサービスシステムを.NETアプリケーションに接続する必要があります。 これを行うには、次のものが必要です。







Microsoft.Extensions.Hosting.WindowsServices



NuGetパッケージを追加する







画像







HostBuilder



でHostBuilderにUseServiceBaseLifetime



呼び出しを追加します







 public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceBaseLifetime() .ConfigureServices(services => { services.AddHostedService<Worker>(); }); }
      
      





このメソッドはいくつかのことを行います。 まず、アプリケーションが実際にWindowsサービスとして機能するかどうかをチェックし、そうでない場合は、noopsを実行します。これにより、ローカルまたはWindowsサービスとして実行するときにこのメソッドを安全に呼び出すことができます。







次に、 ServiceBaseLifetime



を使用するようにホストを構成します。 ServiceBaseLifetime



連携して、Windowsサービスとして起動するアプリケーションのライフタイムを制御するのに役立ちます。 これは、CTL + Cなどの信号を処理する標準のConsoleLifetime



をオーバーライドします。







ワーカーをインストール



ServiceBaseLifetime



を使用してワーカーを取得したら、設定する必要があります。







まず、アプリケーションを公開しましょう。 Windowsサービスをインプレースでインストールします。つまり、サービスが開始されるたびに実行可能ファイルがブロックされます。 公開は、サービスの開始に必要なすべてのファイルが1か所にあり、インストールの準備ができていることを確認するための良い方法です。







 dotnet publish -oc:\code\workerpub
      
      





次に、adminコマンドラインでscユーティリティを使用できます。







 sc create workertest binPath=c:\code\workerpub\WorkerTest.exe
      
      





例:







画像







セキュリティに関する注意:このコマンドは、ローカルシステムとしてサービスを開始しますが、これは必要なものではありません 代わりに、サービスアカウントを作成し、このアカウントとしてWindowsサービスを開始する必要があります。 ここではこれについては説明しませんが、ASP.NETのドキュメントがいくつかあります: https : //docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore- 2.2







ロギング



ログシステムにはイベントログサービスがあり、Windowsイベントログにログメッセージを直接送信できます。 イベントログを入力するには、 Microsoft.Extensions.Logging.EventLog



パッケージを追加し、 Program.cs



変更します。







 public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(loggerFactory => loggerFactory.AddEventLog()) .ConfigureServices(services => { services.AddHostedService<Worker>(); });
      
      





さらなる仕事



次のプレビューでは、Windowsサービスでのワーカーの使用を改善する予定です。







  1. UseWindowsServiceBaseLifetimeの名前をUseWindowsServiceに変更します
  2. Windowsサービスとして起動時のイベントログとの自動および改善された統合を追加します。


おわりに



新しいテンプレートを試してみて、その仕組みを知りたいと思っています。 エラーメッセージや提案はこちらから送信できます: https : //github.com/aspnet/AspNetCore/issues/new/choose







アバター

グレンコンドロン



All Articles