前言
在 .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