如果你的ASP.NET Core服务最后会安装到Windows上运行,那么你肯定不想每次都开个控制台窗口来运行你的服务,因为这样每次开机你都需要手动打开你的服务,其次控制台窗口也容易被用户关掉,你的服务会意外地被终止运行...
如果你的ASP.NET Core服务最后会安装到Windows上运行,那么你肯定不想每次都开个控制台窗口来运行你的服务,因为这样每次开机你都需要手动打开你的服务,其次控制台窗口也容易被用户关掉,你的服务会意外地被终止运行。
使用下面的方法可以快速地把你的ASP.NET Core程序做成Windows Service服务,这样你就可以让Windows来帮你管理服务了,本文的例子基于ASP.NET Core 5.0
安装 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项目:
注册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
本文标题为:如何把ASP.NET Core应用程序做成为Windows Service服务(转载)
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- c# 模拟线性回归的示例 2023-03-14
- Unity Shader实现模糊效果 2023-04-27
- .NET CORE DI 依赖注入 2023-09-27
- Unity3D实现渐变颜色效果 2023-01-16
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- Oracle中for循环的使用方法 2023-07-04
- 如何使用C# 捕获进程输出 2023-03-10
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- user32.dll 函数说明小结 2022-12-26