.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サービスでのワーカーの使用を改善する予定です。
- UseWindowsServiceBaseLifetimeの名前をUseWindowsServiceに変更します
- Windowsサービスとして起動時のイベントログとの自動および改善された統合を追加します。
おわりに
新しいテンプレートを試してみて、その仕組みを知りたいと思っています。 エラーメッセージや提案はこちらから送信できます: https : //github.com/aspnet/AspNetCore/issues/new/choose