ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-04-09 15:02:55  阅读:262  来源: 互联网

标签:Core ASP Service Windows BaseDirectory NET


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

 

标签:Core,ASP,Service,Windows,BaseDirectory,NET
来源: https://www.cnblogs.com/OpenCoder/p/14637085.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有