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服务部署完成,且后台运行。