Net Core基于TopShelf程序运行于服务模式

Net Core基于TopShelf程序运行于服务模式

1 背景

Net Core的本质是窗口程序(windows下的表现形式是console窗口)。客户与本公司的产品部经理都反馈如果不小心关闭了窗口,整个程序被关闭,后果可能会很严重,故将软件通过TopShelf做成服务模式,通过cmd的指令来安装,启动,停止卸载此程序。

2 优势

2.1 服务模式可设置重启条件

比如内存超过1G时,设置重启。

2.2 避免误操作

避免窗口模式误关闭。

3.使用

3.1 GUI方式安装Topshelf包

4 配置

Program.cs文件,详见注释

            var rc = HostFactory.Run(x =>                        
            {
                /*运行MainService主程序*/
                //创建一个MainService服务实例
                x.Service<MainService>(s =>                      
                {
                    //通知TopShelf 这里有一个MainService类型的服务,通过s来配置他的参数
                    s.ConstructUsing(name => new MainService(Directory.GetCurrentDirectory())); 
                    //TopShelf启动服务         
                    s.WhenStarted(tc => tc.Start());  
                    //TopShelf停止服务           
                    s.WhenStopped(tc => tc.Stop());              
                });
                //x.RunAs("username", "password");也可以用户名密码方式运行
                x.RunAsLocalSystem();
                //服务描述
                x.SetDescription("WEBAPIService");     
               //服务显示名称  
                x.SetDisplayName("WEBAPIService");      
                //服务名称          
                x.SetServiceName("WEBAPIService");               
            });             
            //转化退出编码                                     
            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());  
            //设置退出编码
            Environment.ExitCode = exitCode;

5 主程序运行

MainService.cs文件,详见注释。

namespace IBMS.WEBAPI
{
    public class MainService
    {    //创建一个webhost实例
          private IWebHost _webHost;
          private readonly string _contentRoot;
        
          public MainService(string contentRoot)
          {
              _contentRoot = contentRoot;
          }
         //服务模式启动程序
          public void Start()
          {
            // 获取链接字符串
            var config = new ConfigurationBuilder()
                  .SetBasePath(Directory.GetCurrentDirectory())
                  .AddJsonFile("appsettings.json")
                  .Build();
           //配置webhost
            _webHost = new WebHostBuilder()
                  .UseKestrel()
                  .UseContentRoot(_contentRoot)
                  .UseUrls(config["urls"])
                  .UseStartup<Startup>()
                  .UseSerilog()
                  .Build();
            var _logger = _webHost.Services.GetService<ILoggerFactory>().CreateLogger<MainService>();
            _logger.Log(LogLevel.Information, new EventId(1001, "Starting"), "Service Starting");
            //种子数据种入数据库
            using (var scope = _webHost.Services.CreateScope())
            {
                try
                {
                    var context = scope.ServiceProvider.GetService<IIBMSContext>();

                    var concreteContext = (IBMSContext)context;
                    concreteContext.Database.Migrate();
                    SeedData.Initialize(concreteContext);
                }
                catch (Exception ex)
                {
                //    var _logger = scope.ServiceProvider.GetRequiredService<ILogger<MainService>>();
                    _logger.LogError(ex, "An error occurred while migrating or initializing the database.");
                }
            }
            //启动webhost
            _webHost.Start();
          }
        
          public void Stop()
          {
              _webHost?.Dispose();
          }
    }
}

6 安装启动指令

IBMS.WEBAPI.exe install
IBMS.WEBAPI.exe start

7 停止卸载指令

IBMS.WEBAPI.exe uninstall
IBMS.WEBAPI.exe stop

8 服务运行示意图

9 问题思考

如果您知道或者听说有如下问题的解决方案或者开源项目,烦请告知,让我也共同进步下,在此谢过。

9.1 如何制作安装包(3~4个服务)

比如windows上的msi安装包程序。

9.2 有没有windows上配置工具

比如该配置工具能够读入配置文件的参数(config.js,my.ini,appsettings.json,nginx.conf,redis.windows.conf...),并且能够通过该配置管理工具以GUI的人机交互方式将用户自己的配置数据配置如对应的配置文件。
例如:

9.3 有无类似看门狗这种监控服务,设置服务启动停止(安装卸载)的工具

例如:


如果您知道以上3点问题的解决方案或者开源项目,恳请赐教,谢谢。

posted @ 2019-09-17 21:32  JerryMouseLi  阅读(1135)  评论(7编辑  收藏