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/

相关文章
相关标签/搜索