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/