如何把ASP.NET Core应用程序做成为Windows Service服务(转载)
如果你的ASP.NET Core服务最后会安装到Windows上运行,那么你肯定不想每次都开个控制台窗口来运行你的服务,因为这样每次开机你都需要手动打开你的服务,其次控制台窗口也容易被用户关掉,你的服务会意外地被终止运行。
使用下面的方法可以快速地把你的ASP.NET Core程序做成Windows Service服务,这样你就可以让Windows来帮你管理服务了,本文的例子基于ASP.NET Core 5.0 MVC项目。
安装 Microsoft.Extensions.Hosting.WindowsServices 包
详情查看:Microsoft.Extensions.Hosting.WindowsServices
使用下面的命令,为你的ASP.NET Core项目安装 Microsoft.Extensions.Hosting.WindowsServices 包:
Install-Package Microsoft.Extensions.Hosting.WindowsServices
修改 Program.cs
你要做三件事情:
第一、为Host增加UseWindowsServices方法。
第二、注释掉config.SetBasePath方法,因为在Windows Service程序中Directory.GetCurrentDirectory方法返回的是 C:\Windows\system32,在那儿你找不到像appsettings.json这样的依赖文件的,在UseWindowServices以后,系统会自动把默认文件夹指向服务中的可执行文件所在的位置。下面的示例代码中,注意我们把UseWindowsService放到了所有config的最前面。
第三、使用UseUrls方法指定ASP.NET Core应用程序启动后使用的端口号和协议(http、https)。
using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.IO; namespace AspNetCoreWindowsService { public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() .ConfigureAppConfiguration((hostingContext, config) => { //config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); config.AddEnvironmentVariables(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseUrls("http://*:8087", "http://*:8088");//使用UseUrls方法,可以指定ASP.NET Core应用程序绑定的端口号和协议(http、https) webBuilder.UseStartup<Startup>(); }); } }
发布ASP.NET Core项目
根据发布向导,发布ASP.NET Core项目:
本例中,我们发布ASP.NET Core项目的路径是C:\Publish\AspNetCore,如下所示:
注册Windows Service
使用下面的命令把你的ASP.NET Core可执行文件注册为Windows Service:
sc create AspNetCoreWindowsService binPath=C:\Publish\AspNetCore\AspNetCoreWindowsService.exe
启动Windows Service:
测试返回程序当前路径
我们在HomeController中,测试使用AppContext.BaseDirectory、AppDomain.CurrentDomain.BaseDirectory、Directory.GetCurrentDirectory三个方式返回程序当前路径:
using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using System; using System.IO; namespace AspNetCoreWindowsService.Controllers { public class HomeController : Controller { private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; } public IActionResult Index() { this.ViewData["AppContext.BaseDirectory"] = AppContext.BaseDirectory; this.ViewData["AppDomain.CurrentDomain.BaseDirectory"] = AppDomain.CurrentDomain.BaseDirectory; this.ViewData["Directory.GetCurrentDirectory"] = Directory.GetCurrentDirectory(); return View(); } } }
在Index.cshtml视图中,显示三个方式返回的路径:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <div> <h1>Asp Net Core Index View!</h1> </div> <div> <h2>AppContext.BaseDirectory:</h2> @this.ViewData["AppContext.BaseDirectory"].ToString()<br /> <h2>AppDomain.CurrentDomain.BaseDirectory:</h2> @this.ViewData["AppDomain.CurrentDomain.BaseDirectory"].ToString()<br /> <h2>Directory.GetCurrentDirectory:</h2> @this.ViewData["Directory.GetCurrentDirectory"].ToString()<br /> </div> </body> </html>
结果如下所示:
可以看到,当ASP.NET Core应用程序发布为Windows Service后,AppContext.BaseDirectory、AppDomain.CurrentDomain.BaseDirectory可以正确地返回程序当前路径C:\Publish\AspNetCore\,但是Directory.GetCurrentDirectory方法错误地返回了路径C:\Windows\system32,不是程序的当前路径,所以我们在Windows Service程序中,不能使用Directory.GetCurrentDirectory方法。
小结
这篇文章介绍如何把ASP.NET Core做成Windows Service服务和其中的注意事项。整个解决方案简洁高效。
参考文献:
Hosting An ASP.NET Core Web App As A Windows Service In .NET Core 3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2019-04-09 System.IO在不存在的路径下创建文件夹和文件的测试
2019-04-09 SQL SERVER数据库修改是否区分大小写(转载)