c# - 如何将 .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();
}
}
解决方案
我认为通过下载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"
推荐阅读
- vagrant - Vagrant 2.2.3 错误:等待机器启动时超时
- excel - 宏程序不连续运行...只运行一次
- aws-lambda - 在 aws lambda 中运行 AIRFLOW
- go - 如何使用 testify/mock 在 golang 中模拟数据库层
- php - 如果表数据是动态的并且可能最多两个维度,如何将 rowspan 和 colspan 与数据表一起使用?
- verilog - 为什么不在 Verilog 中进行延迟合成?
- php - 数组有 1 个值,我如何分解这个大字符串?
- html - 有什么方法可以在不改变我以前的工作的情况下插入我在 codepen 上找到的一些效果?
- go - 在 Go 中反转切片顺序的惯用方法(不是降序排序)?
- android - 从firebase获取所有孩子(用户)但向一个孩子(用户)显示按钮?