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