如果你的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
