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點問題的解決方案或者開源項目,懇請賜教,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM