服务启动,但程序没有 运行

Service Starts, but The Program does not Run

我们使用 .NET Core 3.1WorkerService 模板创建了一个新的托管服务。

我们希望运行此服务作为“Windows服务”。

如果我 运行 程序手动使用 Powershell shell,它 运行 没问题。

所以我将其添加为 windows 服务。为此,我遵循了以下步骤:

  1. 添加了 Microsoft.Extensions.Hosting.WindowsServices

  2. 向 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);
            })
    
  3. 将其发布到文件夹(压缩并复制到服务器)。

  4. 将其添加为服务:

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

中得到解决