ASP.NET Core Web程序託管到Windows 服務

前言

.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

https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/

相關文章
相關標籤/搜索