ASP.NET Core Web程序托管到Windows 服务
前言
在 .NET Core 3.1和WorkerServices构建Windows服务 我们也看到了,如何将workerservices构建成服务,那么本篇文章我们再来看看如何将web应用程序托管到我们的服务中.
将WEB应用作为服务运行
我们需要将我们的WEB应用程序编译成exe文件,在ASP.NETCore中其实这是一个很简单的过程,我们只需要修改.csproj即可。正如下面代码片段
<TargetFramework>netcoreapp3.1</TargetFramework> <OutputType>Exe</OutputType>
我们只需要添加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作为服务安装。因此,将命令提示符移动到输出文件夹(可能沿着myprojectbinReleasenetcoreapp3.1publish)。并运行类似的内容以作为服务安装:
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。
您的输出路径将从binReleasenetcoreapp3.0publish 更改为binRelease netcoreapp3.0win-x64publish
您还将注意到此新输出目录中的大量文件以及该文件夹的一般大小。但是,考虑到这一点,是的,我们正在部署整个运行时,因此它应该很大。
Content Root
我快速浏览了UseWindowsService的调用在此处的实际源代码。我注意到的是,它专门为在Windows Service下运行的内容设置了根目录。我想知道如果以Windows服务运行时从应用程序内的磁盘读取本地文件怎么办?通常我只会写类似:
File.ReadAllText("myfile.json");
但是……显然,在WindowsService上下文中运行时有一些特殊之处。所以我尝试了一下,我的程序异常了。我不得不检查机器上的事件查看器,发现:
Exception Info: System.IO.FileNotFoundException: Could not find file 'C:WINDOWSsystem32myfile.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/

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
我看JAVA 之 Class
我看JAVA 之 Class 注:基于jdk11 Class 类 Class 的实例代表运行时java应用程序中的类和接口。枚举类型是一种类,注解类是一种接口。数组是共享同一种类的。基 本类型(boolean、byte、char、short、int、long、float和double)和关键字void也表示为类对象。 Class 没有公开的构造方法,只能由JVM创建。 当类加载器调用defineClass方法并传递类文件字节给jvm,jvm会自动构建 Class 对象。 实现了如下接口 1. java.io.Serializable 2. GenericDeclaration GenericDeclaration 所有声明泛型变量的实体要实现此接口(注:后续会在“我看JAVA 之 泛型“阐述) 唯一的方法: public TypeVariable<?>[] getTypeParameters();//获取当前“实体”上声明的“泛型变量"。 3. Type Type是java语言中所有类型的公共高级接口,它们包括原始类型、参数化类型、数组类型、泛型变量和基本类型。 默认方法:...
- 下一篇
睿至大数据:为双态IT注入智能基因
2019年夏天,一组有关中国银行业的数据看似不经意间流传出来,在中国银行业协会公布的《2018年中国银行业社会责任报告》中透露,截止到2018年末,国内已经布放自助设备共计103万台,自助设备交易笔数达400亿笔,交易总额达66万亿元,更为重要的是,全行业平均离柜率达88.68%,国内银行离柜交易额增长至1936万亿。 往前倒推一年,一款叫定损宝2.0的保险AI正式付诸商用,这个号称“将过去由人工肉眼判定车损的环节升级成用人工智能做标准化统一定损”的黑科技产品,展现出了它惊人的准确率和极快的车险定损速度,覆盖了约60%的纯外观损伤案件,减少查勘定损人员50%的工作,在此之前,国内虽有近10万名定损员,却捉襟见肘。 随着数字化、新科技的力量在金融机构中被实践应用,央行也开始深度拥抱金融科技。从2019年8月央行颁布的《金融科技(FinTech)发展规划(2019-2021年)》,到2020年央行工作会议中提出“加强金融科技研发和应用”,结合央行一直以来推动并要求的“全面提高金融服务与金融管理水平”,创新科技在金融行业的应用与实践如今得到了企业实践和行业主管部门的“双线认可”。 很显然,随...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果