前言
在 .NET Core 3.1和WorkerServices構建Windows服務 我們也看到了,如何將workerservices構建成服務,那么本篇文章我們再來看看如何將web應用程式托管到我們的服務中.
將WEB應用作為服務運行
我們需要將我們的WEB應用程式編譯成exe檔案,在ASP.NETCore中其實這是一個很簡單的程序,我們只需要修改.csproj即可,正如下面代碼片段
<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\Release\netcoreapp3.1\publish),并運行類似的內容以作為服務安裝:
sc create ASPNETCoreWindowsService binPath=ASPNETCoreWindowsService.exe
當然我們也可以停止和洗掉該服務
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
https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55316.html
標籤:其他
上一篇:EF Core For Oracle11中Find FirstOrDefault等方法執行失敗
下一篇:WPF 添加提示影片
