Net Core基於TopShelf程序運行於服務模式

Net Core基於TopShelf程序運行於服務模式

1 背景

Net Core的本質是窗口程序(windows下的表現形式是console窗口)。客戶與本公司的產品部經理都反饋若是不當心關閉了窗口,整個程序被關閉,後果可能會很嚴重,故將軟件經過TopShelf作成服務模式,經過cmd的指令來安裝,啓動,中止卸載此程序。web

2 優點

2.1 服務模式可設置重啓條件

好比內存超過1G時,設置重啓。redis

2.2 避免誤操做

避免窗口模式誤關閉。數據庫

3.使用

3.1 GUI方式安裝Topshelf包

4 配置

Program.cs文件,詳見註釋json

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文件,詳見註釋。windows

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 startapp

7 中止卸載指令

IBMS.WEBAPI.exe uninstall
IBMS.WEBAPI.exe stopide

8 服務運行示意圖

9 問題思考

若是您知道或者據說有以下問題的解決方案或者開源項目,煩請告知,讓我也共同進步下,在此謝過。工具

9.1 如何製做安裝包(3~4個服務)

好比windows上的msi安裝包程序。ui

9.2 有沒有windows上配置工具

好比該配置工具可以讀入配置文件的參數(config.js,my.ini,appsettings.json,nginx.conf,redis.windows.conf...),而且可以經過該配置管理工具以GUI的人機交互方式將用戶本身的配置數據配置如對應的配置文件。
例如:

9.3 有無相似看門狗這種監控服務,設置服務啓動中止(安裝卸載)的工具

例如:


若是您知道以上3點問題的解決方案或者開源項目,懇請賜教,謝謝。

相關文章
相關標籤/搜索