日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运行,控制台模式运行主要问题是服务器在重新启动之后不会自动启动,当然也可以选择配置 Windows 计划任务的形式让 控制台在服务器开机时自动启动, 今天给大家分享 .NET 控制台程序和 .NET 开发的 WebAPI 及 Web 项目在以 Windows 服务模式部署时的一些注意事项。

.NET 项目想要部署为 Windows 服务,首先需要通过 NuGet 安装 Microsoft.Extensions.Hosting.WindowsServices ,然后在程序启动时做如下配置:

控制台程序:

using Common;

namespace TaskService
{
class Program
{
static void Main(string[] args)
{
EnvironmentHelper.ChangeDirectory(args); IHost host = Host.CreateDefaultBuilder(args).UseWindowsService()
.ConfigureServices((hostContext, services) =>
{
///各种服务注入
})
.Build(); host.Run();
}
}
}

Web 及 WebAPI 程序:

using Common;

namespace WebAPI
{
public class Program
{
public static void Main(string[] args)
{ EnvironmentHelper.ChangeDirectory(args); var builder = WebApplication.CreateBuilder(args); builder.Host.UseWindowsService(); //各种服务注入 var app = builder.Build(); app.Run();
}
}
}

以上是两种常见程序的启动 Main 函数的配置 Windows 托管模式的演示,其中一个关键点在于 EnvironmentHelper.ChangeDirectory(args);

该方法用于在服务启动时将运行路径重新指向为程序所在目录,默认情况下 .NET 程序在命令启动时,运行路径为执行命令的路径比如在 cmd 中执行如下命令:

虽然程序是放在 d:\Publish\ 文件夹中,但是因为我们执行启动程序命令时的路径是在 c:\User\ZhangXiaoDong 所以程序启动之后的运行环境路径就是 命令执行当前目录,c:\User\ZhangXiaoDong 这时候如果我们的代码中有包含一些涉及到操作 程序所在目录的 IO 操作时就会产生异常,比如 加载 web 项目下的 wwwroot 文件夹中的静态资源,这些都会异常,所以我们需要在程序启动时将 运行目录重定向到 我们的程序所在目录,就用到了 EnvironmentHelper.ChangeDirectory(args);  这个方法。

EnvironmentHelper.ChangeDirectory(args);  实现如下:

using Microsoft.Extensions.Configuration.CommandLine;

namespace Common
{ /// <summary>
/// 环境操作Helper方法
/// </summary>
public class EnvironmentHelper
{ /// <summary>
/// 改变工作目录
/// </summary>
/// <param name="args"></param>
public static void ChangeDirectory(string[] args)
{
var cmdConf = new CommandLineConfigurationProvider(args);
cmdConf.Load(); if (cmdConf.TryGet("cd", out string cdStr) && bool.TryParse(cdStr, out bool cd) && cd)
{
Directory.SetCurrentDirectory(AppContext.BaseDirectory);
}
}
}
}

主要逻辑是判断启动命令中 cd 参数的值是否为 true ,如果 cd=true 则重新配置程序的 CurrentDirectory 为程序文件所在目录。

调整之后我们在启动程序时只要多添加一个参数即可,如下:

只要在原本的启动命令 dotnet d:\Publish\WebAPI.dll 优化为 dotnet d:\Publish\WebAPI.dll --cd='true' 即可,从上图可以看出虽然我们的启动命令还是在 c:\User\ZhangXiaoDong 目录执行的,但是程序的运行目录已经被重定向到了 dotnet d:\Publish\ 这个路径也正是我们的程序所在路径。

有了上面的基础,我们就可以利用 Windows服务器的 SC 指令来配置服务部署了,具体命令如下:

安装

sc.exe create MyAPI binpath= 'd:\Publish\WebAPI.exe --cd="true"' start= auto

安装成功之后控制台会输出  [SC] CreateService 成功 ,其中 MyAPI 时我们创建服务时指定的服务名称,binpath 即是我们的程序路径,注意 true 是 用英文状态的双引号包裹,然后整个 binpath 采用因为状态的 单引号包裹,start= auto 则表示将我们的 MyAPI 服务设置为自动启动。

在 Windows 服务管理中也可以看到我们的服务

启动命令和停止命令,和我们日常操作普通服务的命令一样都是 net start 服务名 和 net stop 服务名,如下:

启动:

net start MyAPI

停止

net stop MyAPI

卸载命令:

sc.exe delete 服务名称

如:sc.exe delete MyAPI

至此 .NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署 就讲解完了,有任何不明白的,可以在文章下面评论或者私信我,欢迎大家积极的讨论交流,有兴趣的朋友可以关注我目前在维护的一个 .NET 基础框架项目,项目地址如下

.NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署的更多相关文章

  1. 黄聪:使用srvany.exe将任何程序作为Windows服务运行

    srvany.exe是什么? srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说sr ...

  2. 使用srvany.exe将任何程序作为Windows服务运行

    使用srvany.exe将任何程序作为Windows服务运行 2011 年 3 月 7 日 !本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使 ...

  3. srvany把程序作为Windows服务运行

    srvany.exe是什么? srvany.exe是Microsoft Windows Resource Kits工具集的一个实用的小工具,用于将任何EXE程序作为Windows服务运行.也就是说sr ...

  4. .NET Worker Service 作为 Windows 服务运行及优雅退出改进

    上一篇文章我们了解了如何为 Worker Service 添加 Serilog 日志记录,今天我接着介绍一下如何将 Worker Service 作为 Windows 服务运行. 我曾经在前面一篇文章 ...

  5. 请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是

    请高手解释这个C#程序,其中ServiceBase是windows服务基类,SmsService是 ServiceBase的子类. static void Main() { ServiceBase[] ...

  6. pm2以windows服务运行

    借助于pm2-windows-service 可以把pm2以windows服务运行.已服务运行的好处就是,即时用户注销也,pm2也会在后台运行 npm i pm2 -g npm i pm2-windo ...

  7. 把java程序作为windows服务运行

    参考: https://www.jianshu.com/p/fc9e4ea61e13 https://blog.csdn.net/qq_28566071/article/details/8088250 ...

  8. 把应用程序exe 注册成为windows 服务的方法

    由于在Windows 服务器上必须要启动一个软件,提供外网访问内网的客户端软件,但是由于每次远程服务器之后会注销当前用户,所以客户端软件就会自动退出,那么我在外网的系统就不能支持访问了. 解决方案:将 ...

  9. 程序自动化需要一个Windows服务

    前段时间,写了一个SPC to SQL数据传输的小功能,用户不太想用手执行或有可能忘记操作.解决这个问题,Insus.NET原本是使用windows的任务管理执行的,但觉得并不太理想,因此又得写一个W ...

随机推荐

  1. Spring框架系列(14) - SpringMVC实现原理之DispatcherServlet处理请求的过程

    前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet ...

  2. Mysql数据库的默认引擎

    InnoDB的优势在于提供了良好的事务处理.崩溃修复能力和并发控制.缺点是读写效率较差,占用的数据空间相对较大. ①InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制.如果需要对事务的完 ...

  3. Collection子接口:Set接口

    1.Set 存储的数据特点:无序的.不可重复的元素具体的:以HashSet为例说明: 1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的. 2. 不 ...

  4. 干货 |《2022B2B新增长系列之企服行业橙皮书》重磅发布

    企服行业面临的宏观环境和微观环境已然发生了明显的变化.一方面,消费级互联网成为过去式,爆发式增长的时代结束.资本.媒体的目光已经悄然聚焦到以企服行业所代表的产品互联网身上,B2B企业正稳步走向C位. ...

  5. 树莓派实战:微信机器人(itchat实现)

    背景 楼主有一台树莓派4B开发板(8G内存版),是目前的顶配机型.这一年来的业余时间,除了写Java.架构方面的文章,也陆续折腾了不少树莓派上的好玩小项目,在此新开一个树莓派实战的文章系列,分享给粉丝 ...

  6. 挑战30天写操作系统-day1-从计算机结构到汇编程序入门

    先动手操作 软盘映像文件制作:先采用二进制编辑器编辑我们所需要的映像文件helloos.img 二进制编辑器下载链接:Bz - c.mos (vcraft.jp) 制作好之后,可以选择写入软盘,通过软 ...

  7. 第二天python3 set常用方法

    set set的元素要求set的元素必须可hash,目前学过的不可hash的类型有list.set: 1.元素不可以被索引 可变的.无序的.不重复的元素的集合 2.set可以被迭代 set增加 add ...

  8. 【web自动化测试】Playwright快速入门,5分钟上手

    我喜欢Playwright! 这是微软开源的一款非常强大的自动化工具,再过几年,他很有可能取代Selenium在浏览器自动化的通知地位.使用过一段时间,我没有找到很好的中文资料可以参考,导致很多问题无 ...

  9. 在DELL服务器上安装windows2012 r2服务器系统

    主要过程: 1.准备安装光盘,开启服务器,当出现画面按F10进入服务器自带光盘系统安装向导.(若没有系统光盘,可以用软蝶通刻一个服务系统到+R的光盘).进入后选择设置和安装系统. 2.开始安装前,提示 ...

  10. Python 车主之家全系车型(包含历史停售车型)配置参数爬虫

    本文仅供学习交流使用,如侵立删!demo下载见文末 车主之家全系车型(包含历史停售车型)配置参数爬虫 先上效果图 环境: win10 ,Contos7.4 python3.9.4 pycharm202 ...