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

  • 相关阅读:
    还在使用golang 的map 做Json编码么?
    Golang 性能测试(2) 性能分析
    golang 性能测试 (1) 基准性能测试
    消息队列 NSQ 源码学习笔记 (五)
    消息队列 NSQ 源码学习笔记 (四)
    消息队列 NSQ 源码学习笔记 (三)
    消息队列 NSQ 源码学习笔记 (二)
    消息队列 NSQ 源码学习笔记 (一)
    你不知道的空格
    Supervisor 使用和进阶4 (Event 的使用)
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/14637085.html
Copyright © 2011-2022 走看看