目录

  • net core基于topshelf程序运行于服务模式
    • 3.1 gui方式安装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点问题的解决方案或者开源项目,恳请赐教,谢谢。