服务启动,但程序没有 运行
Service Starts, but The Program does not Run
我们使用 .NET Core 3.1 和 WorkerService
模板创建了一个新的托管服务。
我们希望运行此服务作为“Windows服务”。
如果我 运行 程序手动使用 Powershell shell,它 运行 没问题。
所以我将其添加为 windows 服务。为此,我遵循了以下步骤:
添加了 Microsoft.Extensions.Hosting.WindowsServices
包
向 CreateHostBuilder 添加了以下内容:
public static IHostBuilder CreateHostBuilder(Serilog.ILogger logger, string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService() // <-- added this line
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true);
})
将其发布到文件夹(压缩并复制到服务器)。
将其添加为服务:
PS C:\Windows\system32> sc.exe create MyService binpath= "C:\Program Files\Services\MyService.exe"
5. Opened the Services snap-in and started the service.
管理单元显示其状态为“运行ning”。
但是,该程序似乎实际上没有做任何事情。它没有记录任何内容,包括最基本的“正在启动”日志消息。
我什至添加了一个 Seq 接收器,以防出现 IO 问题阻止它写入文件。但是什么都没有。
谁能找出我做错了什么?
根据 comment on issue 36065,当 .NET Core 3.1 worker 服务作为 windows 服务运行时,“Directory.GetCurrentDirectory() 将指向 %WINDIR%\system32”。因此要获取当前目录,您可以使用一些反射和类似的东西:
public static IHostBuilder CreateHostBuilder(Serilog.ILogger logger, string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService() // <-- added this line
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.SetBasePath(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
.AddJsonFile("appsettings.json", optional: true);
});
值得注意的是,根据 this comment,它已在 .NET 5.0
中得到解决
我们使用 .NET Core 3.1 和 WorkerService
模板创建了一个新的托管服务。
我们希望运行此服务作为“Windows服务”。
如果我 运行 程序手动使用 Powershell shell,它 运行 没问题。
所以我将其添加为 windows 服务。为此,我遵循了以下步骤:
添加了
Microsoft.Extensions.Hosting.WindowsServices
包向 CreateHostBuilder 添加了以下内容:
public static IHostBuilder CreateHostBuilder(Serilog.ILogger logger, string[] args) => Host.CreateDefaultBuilder(args) .UseWindowsService() // <-- added this line .ConfigureAppConfiguration(configurationBuilder => { configurationBuilder.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true); })
将其发布到文件夹(压缩并复制到服务器)。
将其添加为服务:
PS C:\Windows\system32> sc.exe create MyService binpath= "C:\Program Files\Services\MyService.exe" 5. Opened the Services snap-in and started the service.
管理单元显示其状态为“运行ning”。 但是,该程序似乎实际上没有做任何事情。它没有记录任何内容,包括最基本的“正在启动”日志消息。
我什至添加了一个 Seq 接收器,以防出现 IO 问题阻止它写入文件。但是什么都没有。
谁能找出我做错了什么?
根据 comment on issue 36065,当 .NET Core 3.1 worker 服务作为 windows 服务运行时,“Directory.GetCurrentDirectory() 将指向 %WINDIR%\system32”。因此要获取当前目录,您可以使用一些反射和类似的东西:
public static IHostBuilder CreateHostBuilder(Serilog.ILogger logger, string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindowsService() // <-- added this line
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.SetBasePath(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location))
.AddJsonFile("appsettings.json", optional: true);
});
值得注意的是,根据 this comment,它已在 .NET 5.0
中得到解决