netcore开发windows普通服务(非Web)并一键发布到服务器
netcore下开发windows服务如果是web项目的话,由于aspnetcore本身是支持的,把默认的host.Run改为host.RunAsService就可以了。
但是普通的netcore的控制台项目我终于找到了如下方式来实现:
Microsoft.Extensions.Hosting
System.ServiceProcess.ServiceController
public class ServiceBaseLifetime : ServiceBase, IHostLifetime{private readonly TaskCompletionSource _delayStart = new TaskCompletionSource(); public ServiceBaseLifetime(IApplicationLifetime applicationLifetime) { ApplicationLifetime = applicationLifetime ?? throw new ArgumentNullException(nameof(applicationLifetime)); } private IApplicationLifetime ApplicationLifetime { get; } public Task WaitForStartAsync(CancellationToken cancellationToken) { cancellationToken.Register(() => _delayStart.TrySetCanceled()); ApplicationLifetime.ApplicationStopping.Register(Stop); new Thread(Run).Start(); // Otherwise this would block and prevent IHost.StartAsync from finishing.return _delayStart.Task; } private void Run() {try { Run(this); // This blocks until the service is stopped. _delayStart.TrySetException(new InvalidOperationException("Stopped without starting")); }catch (Exception ex) { _delayStart.TrySetException(ex); } } public Task StopAsync(CancellationToken cancellationToken) { Stop();return Task.CompletedTask; } // Called by base.Run when the service is ready to start.protected override void OnStart(string[] args) { _delayStart.TrySetResult(null);base.OnStart(args); } // Called by base.Stop. This may be called multiple times by service Stop, ApplicationStopping, and StopAsync.// That's OK because StopApplication uses a CancellationTokenSource and prevents any recursion.protected override void OnStop() { ApplicationLifetime.StopApplication();base.OnStop(); }}
public static class ServiceBaseLifetimeHostExtensions{public static IHostBuilder UseServiceBaseLifetime(this IHostBuilder hostBuilder) {return hostBuilder.ConfigureServices((hostContext, services) => services.AddSingleton<IHostLifetime, ServiceBaseLifetime>()); } public static void RunAsService(this IHostBuilder hostBuilder) { hostBuilder.UseServiceBaseLifetime().Build().Run(); } public static Task RunAsServiceAsync(this IHostBuilder hostBuilder) {return hostBuilder.UseServiceBaseLifetime().Build().RunAsync(CancellationToken.None); }}
public class TestService: IHostedService,IDisposable{readonly System.Timers.Timer tmBak = new System.Timers.Timer(); public TestService() { tmBak.Interval = 1000;//1秒执行1次 tmBak.AutoReset = true;//执行1次false,一直执行true tmBak.Enabled = true; tmBak.Elapsed += (sender, eventArgs) => {using (StreamWriter sw = new StreamWriter("D:\\log.txt",true)) { sw.WriteLine($"AntDeploy Windows服务:{DateTime.Now:yyyy-MM-dd HH:mm:ss}"); } }; } public Task StartAsync(CancellationToken cancellationToken) { tmBak.Start();return Task.CompletedTask; } public Task StopAsync(CancellationToken cancellationToken) { tmBak.Stop();return Task.CompletedTask; } public void Dispose() {this.tmBak.Dispose(); }}
class Program{// P/Invoke declarations for Windows.[DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow();[DllImport("user32.dll")] static extern bool IsWindowVisible(IntPtr hWnd);public static bool HaveVisibleConsole(){return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ?IsWindowVisible(GetConsoleWindow()):Console.WindowHeight > 0;} private static async Task Main(string[] args) {var pathToExe = Process.GetCurrentProcess().MainModule.FileName;var pathToContentRoot = Path.GetDirectoryName(pathToExe); Directory.SetCurrentDirectory(pathToContentRoot); var isService = !(Debugger.IsAttached || args.Contains("--console")); if (HaveVisibleConsole()) isService = false;var builder = new HostBuilder() .ConfigureServices((hostContext, services) => { services.AddHostedService<TestService>(); }); if (isService) {await builder.RunAsServiceAsync(); }else {await builder.RunConsoleAsync(); } }}
AntDeploy是我开发的一款开源一键部署vs插件(也是支持脱离vs单独使用的一个开源工具)
开源地址:https://github.com/yuzd/AntDeployAgent
添加一个环境 名字叫 测试 然后 在 测试环境里面添加 windows服务器 这里我做测试就添加就是我本机,注意Host里面是填写格式为:ip:端口号
注意:Token不是windows服务器的密码!!!是安装agent后,agent的配置文件里面配置的Token(你自己自定义配置的)
注意:Port不是你要发布的项目的端口号!!!是安装agent后,agent的配置文件里面配置的端口号(你自己自定义配置的)
点击【Connect Test】按钮进行确认agent可以成功链接,否则会发布失败
如果【Connect Fail】失败 请查看 #10
进入 WindowsService Tab界面
Sdk类型选择 netcore
ServiceName 填写上面我们设置的名称:[TestService]
点击 【Deploy】按钮进行发布
确认服务器无误 点击 【是】开始执行一键部署
如果发布出现错误会出现下图所示:
可以在Log里面查看失败原因是因为我部署agent没有用管路员权限 报权限不足失败 需要用管理员权限运行agent才行
部署成功 如下图:
查看D盘下是否log.txt是否正常每隔1秒写入了当前时间
这里演示的是windows服务上没有这个service
所以自动创建了。
如果service已存在的情况 Deploy 就会全量覆盖 不会重新创建site的。
如果想要覆盖时排除指定文件 可以在 Setting Tab界面的IgnoreList里面增加(支持正则)
原文地址:https://www.cnblogs.com/yudongdong/p/10630835.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
netcore开发windows普通服务(非Web)并一键发布到服务器相关推荐
- 如何在windows下实现快捷命令,一键ssh连接服务器
如何在windows下实现快捷命令,一键ssh连接 每次在windows下连接远程服务器的时候,都要手动ssh root@ip地址,然后每次都要苦恼于这个命令的输入,还要苦恼于ip地址记不住,于是要找 ...
- 为什么某些Win32技术在Windows NT服务中行为不当?
弗兰克·金 服务是具有特殊要求的后台Win32进程.它需要一个独特的入口点和一个回调函数.回调函数被称为服务控制处理程序.新的入口点通常称为ServiceMain,但您可以任意命名. 本文假定您熟悉W ...
- C#开发Windows Service程序
Windows Service概念介绍 Windows Service,也称Windows服务,是32位Windows操作系统中一种长期运行的后台程序.它们长期后台运行,没有用户界面,默默无闻,但它们 ...
- 【招聘(北京)】.NETCORE开发工程师(微服务方向)
组织:华汽集团北京研发中心 位置:北京市朝阳区焦奥中心 官网:www.sinoauto.com 邮箱:taoxu.wei@sinoauto.com 项目:打造面向国内汽车后市场用户的一站式云服务平台( ...
- Windows 网络服务架构系列课程详解(六) ---利用NLB群集实现WEB服务器的可靠性...
Windows 网络服务架构系列课程详解(六) -----利用NLB群集实现WEB服务器的可靠性 实验背景: 在大型网络环境中存在这样一种情景,公司内部的FTP服务器出现故障或脱机了,而且不能快速 ...
- 利用vs.net快速开发windows服务(总结)
引用 http://www.cnblogs.com/lovecherry/archive/2005/03/25/125527.html 在很多应用中需要做windows服务来操作数据库等操作,比如 ( ...
- .NET开发Windows服务
一.概述 本文旨在简单论述如何开发Windows服务程序. 服务名称:ServiceTest 实验环境:VS2015 最终程序结构: 二.步骤 1.创建一个项目,选择Windows 服务,更改项目名称 ...
- 用.Net开发Windows服务初探
用.Net开发Windows服务初探 1 什么是Windows服务 Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合.它没有用户界面,并且也不会产生任何 ...
- 如果彩虹QQ算非法外挂,那么运行在windows上的非微软开发的程序算什么?
如果彩虹QQ算非法外挂,那么运行在windows上的非微软开发的程序算什么?你腾讯QQ不也是利用了一堆微软提供的信息,开放的API了吗?你腾讯QQ不也是windows上的外挂程序吗? 也许有人要说腾讯 ...
最新文章
- 你陪我长大 我陪你变老
- 从一次故障聊聊前端 UI 自动化测试
- RocketMQ几种搭建模式说明
- golang 不定参 可变参 使用 传递
- 添加lombok插件
- 学习编程可以参考哪些网站?
- 马逊s3云存储接口_利用 S3tests 测试 S3 接口兼容性
- codeforce R 491 (div2)
- 面向航空航天工业领域的基于模型的仿真验证工具SkyEye
- java 基本类型 包装类型_Java中基本类型和包装类
- dubbo注册中心介绍
- 【渝粤教育】国家开放大学2018年春季 0434-21T高级英语口语 参考试题
- 总感觉这个访问量过于均匀……
- 红外通信模块——详细资料(含遥控器按键对应的码值)
- 单场淘汰制场次计算方法_校园足球联赛赛制的设计与编排
- 渗透测试学习笔记之案例一
- php 计费系统设计,仓储系统之计费模块设计
- Android车载蓝牙相关开发1:概述及准备
- connect: cannot assign requested address
- 使用Kettle 进行行Oracle数据迁移时处理编码转换处理US7ASCII 编码
热门文章
- 初学者java学习计划_初学者:计划在Windows 7 Media Center中录制直播电视的时间
- Vue.js中的8种组件间的通信方式;3个组件实例是前6种通信的实例,组件直接复制粘贴即可看到运行结果
- zookeeper的单实例和伪集群部署
- 二 面向对象三大特性
- 阿里云MaxCompute香港开服 将引入更多人工智能服务
- 静态属性,函数闭包,call/apply,继承
- 上帝的玩偶:haXe语言
- .net core入门之web应用
- phpmyadmin 安装 配置
- Windows Server 2003域和活动目录