踩坑 Windows 服务来宿主 .NET 程序
本文所指的 .NET 程序为 .NET6 的程序。因为 .NET 的版本更新很快,所以方式、方法也有变化,所以网上搜到的方法有些也过时了。以下是最近我实践下来的一点心得(坑)。 上一篇说到 不安装运行时运行 .NET 程序 后我们的程序已经只有一个 dll/exe 了,但是在 windows 上运行的时候会是一个控制台程序,很容易人不小心关闭了。所以想着把我们的程序部署成 windows 服务,这样不会误关,重启服务器的时候也会自动启动。所以最近折腾了一下把 .NET 程序,特别是 ASP.NET Core 程序部署为 windows 服务。本来以为网上随便搜一搜就很容易,事实上没想得这么美好。
Worker Service
如果你的服务只想执行一些后台任务,比如定时任务,并不提供网站的服务。那么使用 Worker service 项目模板新建一个项目是最合适的。
新建完项目后使用 nuget 安装:
Microsoft.Extensions.Hosting.WindowsServices
修改 program.cs 文件
using WorkerService1;
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService()
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build();
await host.RunAsync();
其中就只添加一句 UseWindowsService
就可以了。
编译之后使用 sc
命令就可以注册为服务了。
sc create "wsTest" binPath=wsTest.exe
sc start "wsTest"
pause
我们把它写成一个 bat 文件方便执行。使用管理权限运行这个 bat 文件服务会被注册并且直接运行:
ASP.NET Core
以上尝试了一下 worker service 模式注册为服务,感觉简单的很。但是下面把 ASP.NET Core 程序注册为服务的时候就没那么简单啦。我查了一些文章,写的时间有些早了,所以还是安照微软官方的文档 Host ASP.NET Core in a Windows Service 的提示来操作。这篇文章虽然叫 Host ASP.NET Core in a Windows Service ,但其实里面的内容说的是上面的 worker service 。当按照上面的步骤尝试把 asp.net core 程序部署为服务的时候死活起不来,一直报未找到文件的异常。 我们新建一个最简单的 asp.net core 程序来演示一下:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Host.UseWindowsService();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
await app.RunAsync();
这是一个最简单的 asp.net core razor pages 程序。我们按照文档安装扩展包:
Microsoft.Extensions.Hosting.WindowsServices
然后调用 UseWindowsService 方法
builder.Host.UseWindowsService();
同样使用 sc 命令注册为服务并运行它。很遗憾它会报错。
经过多种尝试方法都不行。最后翻了一下微软仓库里的 sample 代码才发现原来他们自己的 sample 代码里多了几行代码 。
注意下面的代码了啊 !!!
在构建 builder 的时候需要多传几个参数:
var options = new WebApplicationOptions
{
Args = args,
ContentRootPath = WindowsServiceHelpers.IsWindowsService() ? AppContext.BaseDirectory : default
};
var builder = WebApplication.CreateBuilder(options);
只要使用这段代码来构建 builder ,服务就可以顺利的运行起来。根据以往的经验,可能还是作为服务运行的时候程序根目录的问题,通过以上方法来指定 AppContext.BaseDirectory 来作为程序的根目录,不然就有可能被定位到 system32 目录下。 吐槽。。。虽然解决方案很简单,但是微软没有在文档里把这么关键的代码给些出来,着实有点坑啊,辛亏现在代码都在 github 上,很容易翻到,不然得折腾死人。
PS
就在今天2022/09/02微软的英文文档已经更新了示例代码,中文版还没更新: https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-6.0&tabs=visual-studio#app-configuration-1
相关文章
- 利用Topshelf把.NET Core Generic Host管理的应用程序部署为Windows服务「建议收藏」
- windows 安装es环境,手把手教学
- 从Linux下载文件到Windows没有换行问题详解程序员
- 从Windows传输文件至Linux(windows传文件到linux)
- 在Linux上运行Windows程序的方法(linux运行windows程序)
- 在Windows中快速启动MySQL服务(windows启动mysql服务)
- windows比较:Linux和Windows的优势与劣势(linuxvss)
- 想升级Windows 11这些问题你考虑好了吗?
- Win10 21H1获累积更新 物联网企业版可删除Windows等术语
- 如果你不喜欢Windows 11开始菜单,还可以用注册表换回Windows 10样式
- Zabbix监控(八):自动监控windows端口
- 跨平台利器:.NET在Linux上的运行(.net运行在linux)
- AMSN是一款功能丰富的MSN Messenger软件,遵照GNU GPL进行发布,除了Windows,还可在其他多种平台下运行,比如GNU/Linux、FreeBSD、Mac OS X等。 amsnAMSN 是一款免费而且开放原始码的 MSN 替代工具,它可以说是目前与 MSN 拟真度最高的一款工具,不但支持最流行的动态表情图标,连 MSN 专属的声音传讯或是网络视讯功能也完全支持喔。基本上,只要是你想得到的 MSN 功能,在AMSN上大多有被实现。
- Net不再压着 MSSql,语音变得前景无限(net mssql语音)
- Windows用户学习Linux远程连接命令(linux 远程连接命令)
- asp.net的web服务MSSQL检测ASP.NET的Web服务——利用它构建更棒的站点(mssql检测基于)
- Linux安装轻松:Windows只一步之遥(linux装windows)
- 对比分析:Linux系统与Windows系统的异同(linux系统与windows系统的区别)
- 比较:Linux和Windows哪更适合你?(linux和windows哪个好)
- 数据库NET开发者操作Oracle数据库的全攻略(net操作oracle)
- Oracle Net服务重新上线,确保数据安全(oracle net重启)
- Win11/Win10 手机延续,解锁工具 Windows Phone Internals 2.9.x 发布:使用 .NET 5 SDK 构建,大量增强功能
- Windows下的PHP5.0安装配制详解
- 用.NET创建Windows服务的方法
- windows下部署免费ssl证书(letsencrypt)的方法
- .NET实现可交互的WINDOWS服务的实例代码