ASP.NET Core WebプログラムをWindowsサービスに管理
3453 ワード
前言
はい.NET Core 3.1とWorkerServicesがWindowsサービスを構築する方法も見ました.workerservicesをサービスに構築する方法については、Webアプリケーションをサービスに管理する方法について説明します.
WEBアプリケーションをサービスとして実行
WEBアプリケーションをASP.でexeファイルにコンパイルする必要があります.NETCoreでは簡単なプロセスですが、修正するだけです.csprojでいいです.次のコードクリップのように
netcoreapp3.1
Exe
OutputTypeを追加するだけです.
次にMicrosoftをインストールする必要があります.Extensions.Hosting.WindowsServicesは、Webアプリケーションで次のように表示されます.
Install-Package Microsoft.Extensions.Hosting.WindowsServices
ProgramでcsのCreateDefaultBuilderメソッドでの拡張UseWindowsService
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup();
}).UseWindowsService();
}
上記のコードでは操作が完了しました...
導入サービス
サービスに導入する必要があります
管理者としてコマンドプロンプトを開き、プロジェクトフォルダで次のコマンドを実行してプロジェクトをパブリッシュします.
dotnet publish -c Release
次に、標準Windowsサービスコマンドを使用してexeをサービスとしてインストールできます.したがって、コマンドプロンプトを出力フォルダに移動します(myprojectbinReleaseetcoreapp 3.1publishに沿っている可能性があります).同様の内容をサービスとしてインストールします.
sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe
もちろん、サービスを停止および削除することもできます.
sc.exe stop ASPNETCoreWindowsService
sc.exe delete ASPNETCoreWindowsService
独立した導入
WindowsサービスとしてWeb Appを実行するすべての理由は、コンピュータに他のツールをインストールする必要がないためです.しかし、これは、いわゆる独立した導入を行う場合にのみ有効です.これは、ターゲットコンピュータにインストールすることなく、アプリケーションに必要なすべてをパブリッシュフォルダに配置することを意味します.NET Core運転時.
必要なのはdotnet releaseコマンドを実行することです.追加のフラグが含まれています.
dotnet publish -c Release -r win-x64 --self-contained
これは教えます.NET Core SDKは独立した形式で公開され、Windowsに適用されます.
出力パスはbinReleaseetcoreapp 3.0publishをbinRelease netcoreapp 3に変更します.0\win-x64\publish
また、この新しい出力ディレクトリの大量のファイルとフォルダの一般的なサイズにも注意してください.しかし、この点を考慮すると、はい、実行時全体を配置しているので、それは大きいはずです.
Content Root
UseWindowsServiceの呼び出しがここにある実際のソースコードをすばやく参照しました.Windowsサービスで実行されるコンテンツのルートディレクトリが設定されていることに気づきました.Windowsサービスの実行時にアプリケーション内のディスクからローカルファイルを読み込んだらどうなるか知りたいのですが.普通は似たようなことしか書けません.
File.ReadAllText("myfile.json");
しかし......WindowsServiceコンテキストで実行する場合、いくつかの特殊な点があることは明らかです.だから試してみましたが、プログラムが異常でした.マシンのイベントビューアをチェックしなければなりません.
Exception Info: System.IO.FileNotFoundException: Could not find file 'C:\WINDOWS\system32\myfile.json'.
したがって、Windowsサービスとして実行されると、私のアプリケーションの「ルート」はSystem 32内にあると考えられます.Microsoftのソースコードを再度確認すると、ソリューションが見つかります.コンテンツ・ルート・ディレクトリを設定する同じ方法を簡単に使用して、ファイルを正しい場所からロードできます.
File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "myfile.json"));
Reference
https://github.com/hueifeng/BlogSample/tree/master/src/ASPNETCoreWindowsService
https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/