欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-22 14:25:50
Net Core基于TopShelf程序运行于服务模式 [toc] 1 背景 Net Core的本质是窗口程序(windows下的表现形式是console窗口)。客户与本公司的产品部经理都反馈如果不小心关闭了窗口,整个程序被关闭,后果可能会很严重,故将软件通过TopShelf做成服务模式,通过cmd ......

net core基于topshelf程序运行于服务模式

1 背景

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

2 优势

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

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

2.2 避免误操作

避免窗口模式误关闭。

3.使用

3.1 gui方式安装topshelf包

Net Core基于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 服务运行示意图

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

9 问题思考

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

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

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

9.2 有没有windows上配置工具

比如该配置工具能够读入配置文件的参数(config.js,my.ini,appsettings.json,nginx.conf,redis.windows.conf...),并且能够通过该配置管理工具以gui的人机交互方式将用户自己的配置数据配置如对应的配置文件。
例如:
Net Core基于TopShelf程序运行于服务模式

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

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

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