zoukankan      html  css  js  c++  java
  • 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点问题的解决方案或者开源项目,恳请赐教,谢谢。

  • 相关阅读:
    设计模式学习笔记二十二:对象的轮回
    设计模式学习笔记二十一:代理模式
    Redis学习笔记之ABC
    戒烟日志
    Redis优化之CPU充分利用
    Nginx的作用
    设计模式学习笔记二十:解释器模式
    设计模式学习笔记十九:备忘录模式
    intellIJ IDEA配置maven相关问题记录
    I NETWORK [thread1] waiting for connections on port 27017
  • 原文地址:https://www.cnblogs.com/JerryMouseLi/p/11537372.html
Copyright © 2011-2022 走看看