zoukankan      html  css  js  c++  java
  • 如何把ASP.NET Core应用程序做成为Windows Service服务(转载)

    如果你的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:Windowssystem32,在那儿你找不到像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项目:

    本例中,我们发布ASP.NET Core项目的路径是C:PublishAspNetCore,如下所示:

    注册Windows Service

    使用下面的命令把你的ASP.NET Core可执行文件注册为Windows Service:

    sc create AspNetCoreWindowsService binPath=C:PublishAspNetCoreAspNetCoreWindowsService.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:PublishAspNetCore,但是Directory.GetCurrentDirectory方法错误地返回了路径C:Windowssystem32,不是程序的当前路径,所以我们在Windows Service程序中,不能使用Directory.GetCurrentDirectory方法。

    小结

    这篇文章介绍如何把ASP.NET Core做成Windows Service服务和其中的注意事项。整个解决方案简洁高效。

    原文链接

    参考文献:

    Hosting An ASP.NET Core Web App As A Windows Service In .NET Core 3

  • 相关阅读:
    python3爬虫-快速入门-爬取图片和标题
    数据库Mysql的学习(八)-储存过程和事务和导入导出
    数据库Mysql的学习(七)-自定义函数和流程控制
    git reset --hard HEAD^
    list采坑记录一下
    Linux运行jar包
    JSONObject.toJSONString(map)
    String转list
    判断list中元素是否是相邻
    统计List中相同的元素
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/14637085.html
Copyright © 2011-2022 走看看