首页 > 解决方案 > 如何将 .NET Core 3.1 API Web 应用程序托管为 Windows 服务?

问题描述

我有一个现有的 .NET Core 3.1 API Web 应用程序,我想将其作为 Windows 服务托管。实现这一目标的最佳方法是什么?

我找到了几个教程,说明添加 nuget 包Microsoft.Extensions.Hosting.WindowsServices并使用该UseWindowsService()功能应该足以将其作为 Windows 服务托管。这对我不起作用。我会收到错误 1053:服务没有及时响应启动或控制请求。

我还阅读了有关工作人员服务的信息,但我不知道这将如何与现有的 API 项目一起使用。

我的 Program.cs 看起来像这样:

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false)
                .Build();

            return Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseUrls(config.GetSection("Hosting:Url").Value);
                    webBuilder.UseStartup<Startup>();
                }).UseWindowsService();
        }
    }

标签: c#asp.net-coreasp.net-web-apiasp.net-core-webapi

解决方案


我认为通过下载Microsoft.Extensions.Hosting.WindowsServices包,然后在 Program.csUseWindowsService()的末尾添加CreateHostBuilder,然后发布将是最简单的方法。(这应该是你目前的计划。)

我会收到错误 1053:服务没有及时响应启动或控制请求。

至于您目前遇到的错误,请参考此文档解决。

你可以通过阅读这篇文章来完全发布你的应用程序,并将它变成一个windows服务。(通过阅读这篇文章,我成功地满足了你的需求。)

有两点需要注意。

执行cmd命令时,需要右键选择Run as Administrator,然后执行sc命令。

执行的命令语句binPath和“=​​”不能有空格,但“=”和引号必须分开,这里是一个例子:

C:\WINDOWS\system32>sc create MyService binPath= "C:\Projects\WindowsServiceDemo\bin\Release\netcoreapp3.1\win-x64\WindowsServiceDemo.exe"

推荐阅读