C# 如何将.NET Core 3.1 API web应用程序作为windows服务托管?
我有一个现有的.NET Core 3.1 API web应用程序,我希望将其作为windows服务托管。 实现这一目标的最佳方式是什么 我发现一些教程指出,添加nuget软件包Microsoft.Extensions.Hosting.WindowsServices并使用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项目中使用它 我
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 在我的例子中,有三件事影响了基本目录路径:
private static string GetBasePath()
{
using var processModule = System.Diagnostics.Process.GetCurrentProcess().MainModule;
return Path.GetDirectoryName(processModule?.FileName);
}
当我有时间的时候,我会试着更好地测试这些东西,让它更清晰一点如果你使用它很容易,如果你通过其他方式(不是c#特别是)使用它更容易