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

如果你的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.BaseDirectoryAppDomain.CurrentDomain.BaseDirectoryDirectory.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.BaseDirectoryAppDomain.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服务(转载)