ASP.NET Core Web程序托管到Windows 服务
前言
在 .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
下一篇: 去除button默认样式的方式