zoukankan      html  css  js  c++  java
  • .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服务部署完成,且后台运行。

  • 相关阅读:
    加载spring容器
    id生成工具类
    Spring基础之 反射(Reflection)
    XML解析之dom4j
    我的集合学习笔记--LinkedList
    验证身份证号的正确性
    String系列-----AbstractStringBuilder
    String系列-----String
    Java设计模式-迭代器模式
    Servlet的三个域对象
  • 原文地址:https://www.cnblogs.com/walt/p/11447842.html
Copyright © 2011-2022 走看看