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程序运行于服务模式的更多相关文章

  1. 架构设计 | 基于Seata中间件,微服务模式下事务管理

    源码地址:GitHub·点这里 || GitEE·点这里 一.Seata简介 1.Seata组件 Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用 ...

  2. C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载(极速,简洁)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  3. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务)

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  4. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  5. ASP.NET Core使用TopShelf部署Windows服务

    asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是 ...

  6. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  7. .NET Core微服务之基于Ocelot实现API网关服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...

  8. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  9. 微信小程序和asp.net core基于docker和nginx的交互

    这个文章的题目起的比较长,我想实现这样一个产品: 前端是微信小程序,后端是基于docker运行的asp.net core webapi.webapi通过nginx实现的反向代理接入,nginx同样基于 ...

随机推荐

  1. git语句(后续补充)

    如果你是windows用户,需要下载一个git应用程序,一路点就行,没有什么需要注意的地方 安装完成后在任一文件夹内右键都有显示,单击git bash here即可 简易的命令行入门教程: Git 全 ...

  2. (一)c#Winform自定义控件-基类控件

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  3. 分布式任务队列--Celery的学习笔记

    一.Celery简介 Celery是一个简单,灵活,可靠的分布式系统,用于处理大量消息,同时为操作提供维护此类系统所需的工具.它是一个任务队列,专注于实时处理,同时还支持任务调度. 所谓任务队列,是一 ...

  4. 错误:MSSQLSERVER 17058

    今天还原数据库的时候,在cmd命令行中输入sqlservr.exe -c -f -m出现了 Could not Open Error Log File 这个错误.网上查找了好多办法尝试了都没用.最后花 ...

  5. Appium+python自动化(三十五)- 命令启动appium之 appium服务命令行参数(超详解)

    简介 前边介绍的都是通过按钮点击启动按钮来启动appium服务,有的小伙伴或者童鞋们乍一听可能不信,或者会问如何通过命令行启动appium服务呢?且听宏哥一一道来. 一睹为快 其实相当的简单,不看不知 ...

  6. think in java 泛型

    曾几何时,我们对java的泛型充满了好奇,但是感觉用起来有很爽,但又会在spring类型泛型的地方,遇到问题. 我第一次的遇到泛型是在使用别人的BaseDao的时候,这是一个java封装hiberna ...

  7. Egret白鹭开发微信小游戏手机震动功能

    最近一直在修改调整项目,没有接触新功能,今天终于有机会,去翻了微信API,发现手机震动的API,今天分享出来大家一起学习学习 对于震动,微信提供了两个API,分别是: wx.vibrateShort: ...

  8. Codeforces 985E

    题意略. 思路: 这个题目开始想的有点暴力,后来发现有搜索的性质,因此转而用动态规划.首先,我们要把这些数排个序. 定义状态:dp[i]为排序后i~n能否成功打包,1表示可以,0表示不能打包. 状态转 ...

  9. Linux下串口配置初步探寻

    一.在struct termios结构体中,对串口进行基本配置(如波特率设置,校验位和停止位设置 等). (一): struct termios   //串口的设置主要是设置struct termio ...

  10. ES6之解构

    1.ES6允许按照一定的模式,从数组中和对象中提取值,对变量进行赋值,这种称为解构(Distructuring): let [a,b,c] = [3,5,6];// 相当于 a=3,b=5,c=6 本 ...