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包
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点问题的解决方案或者开源项目,恳请赐教,谢谢。