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点问题的解决方案或者开源项目,恳请赐教,谢谢。
Net Core基于TopShelf程序运行于服务模式的更多相关文章
- 架构设计 | 基于Seata中间件,微服务模式下事务管理
源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...
- C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案
本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...
- ASP.NET Core使用TopShelf部署Windows服务
asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是 ...
- 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序
引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...
- .NET Core微服务之基于Ocelot实现API网关服务
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...
- 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)
并发编程概述 前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...
- 微信小程序和asp.net core基于docker和nginx的交互
这个文章的题目起的比较长,我想实现这样一个产品: 前端是微信小程序,后端是基于docker运行的asp.net core webapi.webapi通过nginx实现的反向代理接入,nginx同样基于 ...
随机推荐
- 前端模板引擎doT.js的用法
简介 一款简单好用的前端模板引擎 用法 <script type="text/javascript" src="js/doT.min.js">< ...
- cs231n---生成模型
1 生成模型的定义和分类 生成模型是一种无监督学习方法.其定义是给一堆由真实分布产生的训练数据,我们的模型从中学习,然后以近似于真实的分布来产生新样本. 生成模型分为显式和隐式的生成模型: 为什么生成 ...
- 探究光线追踪技术及UE4的实现
目录 一.光线追踪概述 1.1 光线追踪是什么 1.2 光线追踪的特点 1.3 光线追踪的历史 1.4 光线追踪的应用 二.光线追踪的原理 2.1 光线追踪的物理原理 2.2 光线追踪算法 2.3 R ...
- Xcodebuild命令使用
Xcodebuild简介 Xcodebuild是命令行工具包的其中一项. 命令行工具包(Command Line Tools)是一个轻量的.可以与XCode分开的.在Mac上单独下载的命令行工具包. ...
- WIN10家庭版桌面右键单击显示设置出现ms-settings:display或ms-settings:personalization-background解决办法[原创]
最近,笔者的笔记本卸载oracle数据库,注册表里面删除了不少相关信息,没想到担心的事情还是来了!桌面右键单击显示设置出现ms-settings:display或ms-settings:persona ...
- mybatis 源码分析(三)Executor 详解
本文将主要介绍 Executor 的整体结构和各子类的功能,并对比效率: 一.Executor 主体结构 1. 类结构 executor 的类结构如图所示: 其各自的功能: BaseExecutor: ...
- Python爬虫(一)抓取指定的页面
(以下是在windows环境下的操作,python版本为3) 1.urllib库介绍 官方文档上的解释是: urllib is a package that collects several modu ...
- BUPTOJj83
83. A + B Problem 时间限制 1000 ms 内存限制 65536 KB 题目描述 Calculate the sum of two given integers A and B. 输 ...
- 强烈推荐 GitHub 上值得前端学习的开源实战项目
强烈推荐 GitHub 上值得前端学习的开源实战项目. Vue.js vue-element-admin 是一个后台前端解决方案,它基于和 element-ui 实现 基于 iView 的 Vue 2 ...
- html中video标签
video标签: <video src="视频的后缀名是.webM/.ogg/.mp4 "></video>属性: src:用于告诉video标签需要播放的 ...