如何把ASP.NET Core应用程序做成为Windows Service服务(转载)

您所在的位置:网站首页 将exe做成系统服务 如何把ASP.NET Core应用程序做成为Windows Service服务(转载)

如何把ASP.NET Core应用程序做成为Windows Service服务(转载)

2024-07-10 14:00| 来源: 网络整理| 查看: 265

如果你的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(); }); } }

 

发布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 _logger; public HomeController(ILogger 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> Index Asp Net Core Index View! AppContext.BaseDirectory: @this.ViewData["AppContext.BaseDirectory"].ToString() AppDomain.CurrentDomain.BaseDirectory: @this.ViewData["AppDomain.CurrentDomain.BaseDirectory"].ToString() Directory.GetCurrentDirectory: @this.ViewData["Directory.GetCurrentDirectory"].ToString()

结果如下所示:

可以看到,当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

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3