オリジナル:.NETコア内のWindowsサービスの作成-パート1 - 「マイクロソフト」ウェイ
著者:DOTNETコアチュートリアルの
翻訳:Lamond呂は
尋ねた: -公式の使用は、.NETのコアの(a)の使用をWindowsサービスを作成する方法を推奨します
バッチジョブを実行するか、バックグラウンドタスクを実行するためのWindowsサービスを作成し、それは非常に一般的なパターンですが、原因クラウドサービス(アマゾンラムダ、アズールWebJobsとAzureの機能)の増殖には、おそらくWindowsサービスを使用しません。個人的に、私は*私は雲の中にそれを実行する方法を検討する必要がなく、コンソールアプリケーションに直接書き込むことができるので、バッチファイルが自動化されたタスクにロードすることができ、7を保証することができ、アズールWebJobsを使用したいです24時間走行。
しかし、多分あなたは、クラウドサービスを使用していない、またはあなたがレガシーアプリケーションの束を持っているしたい場合はニーズを実行するWindowsサービスは、.NETのコアに変換するように、しかし、完全に「サーバレス」(サーバレス)のアプリケーションに変換することはできません。だからここにあなたのための記事です。
多くの点、.NETコアWindowsサービスとWindowsサービスで、.NET Frameworkのと全く同じで。しかし、書き込みサービスの時に、あなたはいくつかのマイナーな問題が発生することがあります。また、本論文では、我々は唯一のWindowsサービスの「Microsoft」の道を作成し紹介し、フォローアップでは、私は、サードパーティのライブラリを使用する方法をご紹介していきますTopShelf
プロセスにそれを簡素化します。
インストール
Visual Studioは、Windowsサービスを作成するためのテンプレートを提供していないので、私たちは、コンソールプログラムのアプローチを作成することで、Windowsサービスを作成する必要があります。
一度作成された、我々はNugetパッケージをインストールする必要があり、このパッケージには、例えば、これらのAPIは、実際に完全なフレームワークを提供しますが、その多くは、Windows固有のもので、.NETのコアにいくつかのWindows固有のAPIが追加されます、 Windowsサービス。このように、彼らはベースの.NETのコアライブラリに含まれていませんが、道Nugetパッケージにより、.NETのコアに導入することができます。
ここでは、パッケージマネージャコンソールで次のコマンドを入力することができます。
Install-Package Microsoft.Windows.Compatibility
コード
上で紹介しNugetパッケージ、我々が興味を持っているほとんどのServiceBase
クラス。これは、イベントフックのシリーズを提供するWindowsサービスを記述するための基底クラスなので、上のサービスの開始、終了、一時停止などがあります。
その下に、私たちはあなたのコードでクラスを作成しますが、このクラスは、一時ファイルに簡単なログ出力の一部を担当しています。私たちは、関係する原理を理解するために、この例を使用します。次のように私たちのコードは次のとおりです。
class LoggingService : ServiceBase
{
private const string _logFileLocation = @"C:\temp\servicelog.txt";
private void Log(string logMessage)
{
Directory.CreateDirectory(Path.GetDirectoryName(_logFileLocation));
File.AppendAllText(_logFileLocation, DateTime.UtcNow.ToString() + " : " + logMessage + Environment.NewLine);
}
protected override void OnStart(string[] args)
{
Log("Starting");
base.OnStart(args);
}
protected override void OnStop()
{
Log("Stopping");
base.OnStop();
}
protected override void OnPause()
{
Log("Pausing");
base.OnPause();
}
}
だからここにあなたが私たちのクラスを継承していることがわかりますServiceBase
クラスを、我々はいくつかのイベントの方法、ログのいくつかの出力を書き直しました。サービスを開始すると、それが引き金となりOnStart
、イベントを、サービスの終了時には、トリガとなるOnStop
イベントを。ここでは、中に置かれすぎて面倒な作業になるべきではありませんOnStart
処理するイベント。
私たちはから望んでいた場合はMain
、開始サービスを、コードは非常に簡単です。
static void Main(string[] args)
{
ServiceBase.Run(new LoggingService());
}
それはすべてのコードです。
サービスの展開
サービスを公開するとき、我々は我々が必要とするサービスを構築するためのVisual Studioに頼ることができるだけでなく、我々はまた、Windowsが実行されているために特別に構築する必要があります。この目的のために、我々は、コマンドプロンプトプロジェクトのルートディレクトリで次のコマンドを実行する必要があります。ここで我々が通過していることに注意してください-r
プラットフォームを構築するためにそれを伝えるためのフラグを。
dotnet publish -r win-x64 -c Release
コマンドの実行が終了した後、我々は次のよう確認することができ/bin/release/netcoreappX.X/publish
、ディレクトリを我々はすべての公開コードを見つけることができますが、最も重要なのは、我々は、exeファイルの実行可能ファイルを取得することができる場所。我々は実行時に指定しない場合は、我々は唯一のdllアセンブリの.NETのコアは、このアセンブリを使用して取得します、我々は、Windowsサービスを作成する方法がありません。
今、私たちは、他の場所で、このリリースのディレクトリを移動することができますが、今は一時的に現在のリリースのディレクトリを使用します。
次に、我々は、管理者の役割は、コマンドプロンプトを開き、次のコマンドを入力して使用する必要があります。
sc create TestService BinPath=C:\full\path\to\publish\dir\WindowsServiceExample.exe
SC
コマンドは、Windowsサービスをインストールするために使用することができ、標準のWindowsコマンド(.NETのコアとは何の関係も)ではありません。私たちのサービスの名前はここではテストしますTestService
、もっと重要なのは、我々が渡されBinPath
、指定された実行可能exeファイルのパラメータを。
実行した後、我々は次のような結果を取得する必要があります。
[SC] CreateService SUCCESS
その後、我々はサービスを開始されなければなりません。
sc start TestService
今、私たちは、サービスの動作を見るために私達のログファイルを見ることができます。
あなたがサービスを停止し、削除したい場合は、私たちは、次のコマンドを使用することができます。
sc stop TestService
sc delete TestService
サービスのデバッグ
ここでは、私は本当に「マイクロソフト」の方法の使用は失敗する運命にあると信じています。以来サービスを委託することはあまりにも面倒です。
まず、私たちはしますServiceBase
、我々は、デバッグにそれらをより困難にし、クラス、外でそれらにアクセスできないことを意味し、保護するメソッドをオーバーライド。これは少し混乱していますが、ここで私は、最善のアプローチは、各イベントと完了に保護された方法でこれらのパブリックメソッド呼び出しの公開方法を提供することであることがわかりました
public void OnStartPublic(string[] args)
{
Log("Starting");
}
protected override void OnStart(string[] args)
{
OnStartPublic(args);
base.OnStart(args);
}
しかし、少なくとも、私たちは次のことを行うことができます。
static void Main(string[] args)
{
var loggingService = new LoggingService();
if (true) //Some check to see if we are in debug mode (Either #IF Debug etc or an app setting)
{
loggingService.OnStartPublic(new string[0]);
while(true)
{
//Just spin wait here.
Thread.Sleep(1000);
}
//Call stop here etc.
}
else
{
ServiceBase.Run(new LoggingService());
}
}
あなたの他のオプションは、デバッグモードプロジェクトのリリース、インストールサービスで行われ、その後、デバッガをアタッチしています。実際には、これはMicrosoftが、あなたが使用することをお勧めの方法ですが、私は、これは単に混乱だと思います。
フォロー
私たちは、SCは、バッチファイルINSTALL.BATを作成することによって、私たちのためにコマンドを作成して実行することができますように実際には、ここでは、いくつかの他の有用なことを行うことができます。しかし、私たちは上で見ていない、デバッグの問題は、この方法を使用する場合、もはや私を作っていると思います。幸いなことに、命名がありTopshelf
、ライブラリは、多くの問題を軽減することができ、このシリーズの次のパートでは、我々はそれがどのように検証します。