.NET Core Generic Host项目使用Topshelf部署为Windows服务

1..NET Core Generic Host是什么?

在.NET Core 2.1版本加入了一种新的Host,即Generic Host(通用主机)。

现在在2.1版本的Asp.Net Core中,有了两种可用的Host:

  • Web Host:适用于托管Web程序的Host,就是我们所熟悉的在Asp.Net Core应用程序的Mai函数中用CreateWebHostBuilder创建出来的常用的WebHost。
  • Generic Host:(ASP.NET Core 2.1版本才有) – 适用于托管非 Web 应用(例如,运行后台任务的应用)。 在未来的版本中,通用主机将适用于托管任何类型的应用,包括 Web 应用。

2.具体实现

因为我的windows服务是一个后台一直执行的服务,所有在服务设计上我采用BackgroundService类型。

(1)重写IHostLifeTime,改变程序的生命周期

框架中支持ConsoleLifetime。如果想要替换这个,需要实现IHostLifetime来管理生命周期。

internal class TopshelfLifetime : IHostLifetime
    {
        public TopshelfLifetime(IApplicationLifetime applicationLifetime, IServiceProvider services)
        {
            ApplicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime));
        }

        private IApplicationLifetime ApplicationLifetime { get; }

        public Task WaitForStartAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }

        public Task StopAsync(CancellationToken cancellationToken)
        {
            return Task.CompletedTask;
        }
    }

(2)实现自己的服务

public class TestService : BackgroundService
{
  protected override Task ExecuteAsync(CancellationToken stoppingToken)
   {
      //....
   }
}

(3)在Main函数里面注入

 .ConfigureServices((hostContext, services) =>
   {
       // 注入服务
       services.AddSingleton<IHostLifetime, TopshelfLifetime>();
       services.AddHostedService<TestService>();
   })

3.部署windows服务

在项目 csproj 文件夹下,打开控制台窗口(管理员角色)

 输入命令:

dotnet publish -c release -r win-x64

命令完成后,在bin目录下,生成publish文件夹,然后使用cd命名切换到该文件夹下(找到该目录下exe文件),输入命令:

.TestService.exe install

此时,windows服务已经创建好了,但是还是没有启动,所以需要输入命令启动:

net statrt TestService(服务名称)

至此,windows服务部署完成,且后台运行。

原文地址:https://www.cnblogs.com/walt/p/11447842.html