首页 > 系统相关 >踩坑 Windows 服务来宿主 .NET 程序

踩坑 Windows 服务来宿主 .NET 程序

时间:2022-09-02 09:25:56浏览次数:78  
标签:服务 Windows builder 程序 Host UseWindowsService 宿主 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 上,很容易翻到,不然得折腾死人。

关注我的公众号一起玩转技术

标签:服务,Windows,builder,程序,Host,UseWindowsService,宿主,NET
From: https://www.cnblogs.com/kklldog/p/host-net-on-windows-service.html

相关文章

  • OpenCV的Windows程序图像处理,Win32 SDK,VS2022
    Windows程序调用OpenCV进行图像捕捉和处理显示1.OpenCV的视频接口VideoCapture很简洁,显示可以直接把图片帧数据转换成BMP,用StretchDIBits显示,方便又灵活。2.Windows用......
  • .Net Core 配置文件读取 - IOptions、IOptionsMonitor、IOptionsSnapshot
    原文链接:https://www.cnblogs.com/ysmc/p/16637781.html众所周知,appsetting.json配置文件是.Net的重大革新之心,抛开了以前繁杂的xml文件,使用了更简洁易懂的json方式......
  • netstat 查看TCP状态值
     一。TCP状态值netstat-n|awk'/^tcp/{++S[$NF]}END{for(ainS)printa,S[a]}'CLOSED:无连接是活动的或正在进行LISTEN:服务器在等待进入呼叫SYN_RECV:一个连......
  • Docker 映射端口telnet不通
    使用Docker启动端口无法telnethttps://blog.csdn.net/lyd135364/article/details/118369692#echo1>/proc/sys/net/ipv4/ip_forward#sysctl-p......
  • windows10 改mac地址的方法
    mac地址就是网卡的物理地址,一般每台电脑都会有一个网卡,而每个网卡上面都会提供一个独立的mac地址。为了保护帐户安全,win10系统经常修改自己的mac地址,以防止地址被破解或占......
  • 关于配置中科大的校园网络ustc-guest ustcnet eduroam的连接
    又是一年开学季,想到自己开学的时候经常搞不懂校园网的配置和连接(实际上过了一年多才搞清楚),于是写下这篇文档看看能不能帮到更多ustcers。目前的校园网大概有三类,一个是免......
  • 穿越时间·Plus! 2001年 Microsoft Plus! for Windows XP
    穿越时间·Plus!2001年MicrosoftPlus!forWindowsXP穿越时间更多内容请移步关注百度百家号:穿越时间我的电脑​关注 35人赞同了该文章......
  • Windows下Conda自定义env安装目录
    楔子windows下,conda会将新的环境安装到%USERFROFILE%/.cond/envs下,但是到后来清理C盘的时候,就想着如何将这个envs搬到D盘我将envs移动到D盘后,然后将C盘的envs删除了,然......
  • .NET 7 性能改进 -- 至今为止最快的.NET平台
    .NET7性能改进--至今为止最快的.NET平台 2022年8月31日StephenToub发布的关于 .NET7性能改进的博客,核心主题是.NET7速度很快。这篇博客非常的长,我尝试......
  • .net core微服务系列之前言
    微服务概念其实已经流行了不短的年头了,只是大部分实战都是在以java为主的大型互联网公司使用,.net在国内的市场,作为.net程序猿们都懂得,就拿北京来说,前2年别说微服务了,就......