前言
在 .NET Core 3.1和WorkerServices構建Windows服務 咱們也看到了,如何將workerservices構建成服務,那麼本篇文章咱們再來看看如何將web應用程序託管到咱們的服務中.html
將WEB應用做爲服務運行
咱們須要將咱們的WEB應用程序編譯成exe文件,在ASP.NETCore中其實這是一個很簡單的過程,咱們只須要修改.csproj便可。正以下面代碼片斷git
<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp3.1</TargetFramework> <OutputType>Exe</OutputType> </PropertyGroup> </Project>
咱們只須要添加OutputType便可.github
接着來咱們須要安裝Microsoft.Extensions.Hosting.WindowsServices到咱們的WEB應用程序中,以下所示:web
Install-Package Microsoft.Extensions.Hosting.WindowsServices
如今咱們須要在Program.cs中的CreateDefaultBuilder方法中進行擴展UseWindowsServicejson
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(); }
上述代碼中咱們已經操做完了....windows
部署服務
咱們還須要作的是部署到咱們的服務中.bash
以管理員身份打開命令提示符,而後在項目文件夾中運行如下命令以發佈項目:app
dotnet publish -c Release
接下來,咱們可使用標準Windows服務命令將exe做爲服務安裝。所以,將命令提示符移動到輸出文件夾(可能沿着myproject\bin\Release\netcoreapp3.1\publish)。並運行相似的內容以做爲服務安裝:工具
sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe
固然咱們也能夠中止和刪除該服務ui
sc.exe stop ASPNETCoreWindowsService sc.exe delete ASPNETCoreWindowsService
獨立部署
將Web App做爲Windows服務運行的所有緣由是,咱們沒必要在計算機上安裝其餘工具。但這隻有在咱們進行所謂的獨立部署時纔有效。這意味着咱們將應用程序所需的一切部署在發佈文件夾中,而沒必要在目標計算機上安裝.NET Core運行時。
咱們須要作的就是運行咱們的dotnet release命令,其中包含一些額外的標誌:
dotnet publish -c Release -r win-x64 --self-contained
這告訴.NET Core SDK咱們要以獨立形式發佈,而且適用於Windows。
您的輸出路徑將從bin\Release\netcoreapp3.0\publish 更改成\bin\Release netcoreapp3.0\win-x64\publish
您還將注意到此新輸出目錄中的大量文件以及該文件夾的通常大小。可是,考慮到這一點,是的,咱們正在部署整個運行時,所以它應該很大。
Content Root
我快速瀏覽了UseWindowsService的調用在此處的實際源代碼。我注意到的是,它專門爲在Windows Service下運行的內容設置了根目錄。我想知道若是以Windows服務運行時從應用程序內的磁盤讀取本地文件怎麼辦?一般我只會寫相似:
File.ReadAllText("myfile.json");
可是……顯然,在WindowsService上下文中運行時有一些特殊之處。因此我嘗試了一下,個人程序異常了。我不得不檢查機器上的事件查看器,發現:
Exception Info: System.IO.FileNotFoundException: Could not find file 'C:\WINDOWS\system32\myfile.json'.
所以,看成爲Windows服務運行時,個人應用程序的"根"認爲它位於System32內。再次查看Microsoft的源代碼能夠找到解決方案。我能夠簡單地使用它們設置內容根目錄的相同方法,以從正確的位置加載個人文件:
File.ReadAllText(Path.Combine(AppContext.BaseDirectory, "myfile.json"));
Reference
https://github.com/hueifeng/BlogSample/tree/master/src/ASPNETCoreWindowsService