序文
で、ビルドのWindowsサービス、.NETのコア3.1とWorkerServicesは、我々はworkerservicesは、サービスに組み込むか、見てきたし、我々は、Webアプリケーションは、当社のサービスをホストしている方法を見て、この記事。
WEBアプリケーションは、サービスとして実行されます
我々は唯一の.csprojを変更する必要があり、これは非常に単純なプロセスであり、私達のWEBアプリケーションは、実際にASP.NETCoreで、EXEファイルにコンパイルされる必要があります。意志スニペットとして、
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<OutputType>Exe</OutputType>
</PropertyGroup>
</Project>
私たちは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<Startup>();
}).UseWindowsService();
}
上記のコードは、私たちが行って事業を展開している....
展開サービス
当社は、当社のサービスを展開することを行う必要があります。
管理者としてプロンプトのコマンドを開き、プロジェクトフォルダにプロジェクトを発行するには、次のコマンドを実行します。
dotnet publish -c Release
次に、我々はサービスとしてインストールされている標準のWindowsサービスexeファイルのコマンドを使用することができます。(おそらくmyprojectに沿っ\ binに\リリース\ netcoreapp3.1 \公開)出力フォルダによって、コマンドプロンプト動きます。そして、サービスとして実行するように同様のコンテンツ:
sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe
もちろん、我々はまた、サービスを停止して削除することができます
sc.exe stop ASPNETCoreWindowsService
sc.exe delete ASPNETCoreWindowsService
独立した展開
Webアプリケーションは、Windowsサービスとして実行されている全体の理由は、我々は、コンピュータ上の他のツールをインストールする必要はありません。しかし、唯一の私たちの中には、いわゆる独立して展開したときに有効。私たちは、.NETのコアランタイムにせずに、必要なすべてのアプリケーションのリリースフォルダーを展開することを、この手段は、ターゲットコンピュータにインストールされています。
我々はいくつかの追加のフラグが含まれている当社DOTNET解除コマンドを実行される実行する必要があります。
dotnet publish -c Release -r win-x64 --self-contained
これは、我々は独立した形とWindowsで利用可能な中で公開したい.NETのコアSDKに伝えます。
ビンからあなたの出力パス\リリース\ \ binに\リリースnetcoreapp3.0 \勝つ-x64のを\公表\に変更さnetcoreapp3.0を公開
あなたはまた、多数のファイルとフォルダの一般的なサイズのこの新しい出力ディレクトリに気づくでしょう。しかし、この点を考慮して、はい、私たちは、全体の動作を展開しているので、それは素晴らしいでなければなりません。
コンテンツのルート
私はここUseWindowsServiceコール実際のソースコードを簡単に見ています。私は気づいた、それはWindowsのサービスにコンテンツランニングのための特別なルートディレクトリを設定することです。私が行う方法をWindowsサービスとして実行する場合、ローカルファイルを読み込むアプリケーションのディスクの中から知りたいですか?私は通常だけのような何かを書きます:
File.ReadAllText("myfile.json");
しかし......もちろん、Windowsサービス時間のコンテキストで実行するためにいくつかの特別な機能があります。だから私は異常、私のプログラムを、それを試してみました。私は、マシン上のイベントビューアをチェックしなければならなかったし、それを見つけました:
例外情報:System.IO.FileNotFoundException:ファイル ':\ WINDOWS \ SYSTEM32 \ myfile.json C' が見つかりませんでした。
Windowsサービス、「ルート」として実行している場合ので、私はそれのアプリケーションがSYSTEM32に配置されると思います。ビューのMicrosoftのソースコードは再び解決策を見つけることができます。私は単純に正しい場所から自分のファイルをロードするために、彼らはルートディレクトリの内容を設定するのと同じ技術を使用することができます。
File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "myfile.json"));
参照
https://github.com/hueifeng/BlogSample/tree/master/src/ASPNETCoreWindowsService