C# 如何将.NET Core 3.1 API web应用程序作为windows服务托管?

C# 如何将.NET Core 3.1 API web应用程序作为windows服务托管?,c#,asp.net-core,asp.net-web-api,asp.net-core-webapi,C#,Asp.net Core,Asp.net Web Api,Asp.net Core Webapi,我有一个现有的.NET Core 3.1 API web应用程序,我希望将其作为windows服务托管。 实现这一目标的最佳方式是什么 我发现一些教程指出,添加nuget软件包Microsoft.Extensions.Hosting.WindowsServices并使用UseWindowsService()函数应该足以将其作为windows服务托管。 这对我不管用。我将得到错误1053:服务没有及时响应启动或控制请求 我也读过关于worker服务的文章,但我不知道如何在现有API项目中使用它 我

我有一个现有的.NET Core 3.1 API web应用程序,我希望将其作为windows服务托管。 实现这一目标的最佳方式是什么

我发现一些教程指出,添加nuget软件包Microsoft.Extensions.Hosting.WindowsServices并使用
UseWindowsService()
函数应该足以将其作为windows服务托管。 这对我不管用。我将得到错误1053:服务没有及时响应启动或控制请求

我也读过关于worker服务的文章,但我不知道如何在现有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();
        }
    }
公共类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
var config=new ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false)
.Build();
返回Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
UseUrls(config.GetSection(“Hosting:Url”).Value);
webBuilder.UseStartup();
}).UseWindowsService();
}
}
我就是这样做的:

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.WindowsServices;

namespace App.Name.API
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().RunAsService();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
    }
}
使用Microsoft.AspNetCore;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.AspNetCore.Hosting.WindowsServices;
名称空间App.Name.API
{
公共课程
{
公共静态void Main(字符串[]args)
{
CreateWebHostBuilder(args.Build().RunAsService();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup();
}
}

我使用CreateWebHostBuilder而不是CreateWebHostBuilder,因为我更习惯它(而且不确定两者之间的区别)。

我认为通过下载
Microsoft.Extensions.Hosting.WindowsServices
包,然后在Program.cs中的
CreateHostBuilder
末尾添加
UseWindowsService()
,那么出版将是最简单的方式。(这应该是您当前的计划。)

我将得到错误1053:服务没有响应启动或关闭 及时控制请求

对于您当前遇到的错误,请参阅以解决

通过阅读,您可以完全发布应用程序,并将其转换为windows服务。(通过阅读本文,我成功地满足了您的需求。)

有两点需要注意。

执行cmd命令时,需要右键单击并选择
以管理员身份运行
,然后执行sc命令

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

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

关于.net core windows服务的1053错误,可能对其他人有所帮助:

如果appsettings.json(或与基本目录相关的其他外部配置文件)的路径不正确,则会得到1053

在我的例子中,有三件事影响了基本目录路径:

  • 已选中发布选项“生成单个文件”
  • 从Services.exe作为服务启动(同一应用程序作为控制台打开时没有问题)
  • 如何获得应用程序库目录
  • 关于第三点,我记不清了,特别是因为我通过反复试验找到了这些东西,但以下代码对我很有用:

    private static string GetBasePath()
    {
        using var processModule = System.Diagnostics.Process.GetCurrentProcess().MainModule;
        return Path.GetDirectoryName(processModule?.FileName);
    }
    
    当我有时间的时候,我会试着更好地测试这些东西,让它更清晰一点

    如果你使用它很容易,如果你通过其他方式(不是c#特别是)使用它更容易