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