如果你的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服务(转载)
基础教程推荐
- ZooKeeper的安装及部署教程 2023-01-22
- C#类和结构详解 2023-05-30
- C# List实现行转列的通用方案 2022-11-02
- unity实现动态排行榜 2023-04-27
- C#控制台实现飞行棋小游戏 2023-04-22
- C# 调用WebService的方法 2023-03-09
- winform把Office转成PDF文件 2023-06-14
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- 一个读写csv文件的C#类 2022-11-06
- C# windows语音识别与朗读实例 2023-04-27