.NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署 ...

农民  金牌会员 | 2022-9-17 08:40:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 538|帖子 538|积分 1614

日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 IIS 托管的情况,直接运行有两种方式,一种是部署为 服务模式,另一种则是 直接启动 .NET 发布之后的 exe 文件以 控制台模式运行,控制台模式运行主要问题是服务器在重新启动之后不会自动启动,当然也可以选择配置 Windows 计划任务的形式让 控制台在服务器开机时自动启动, 今天给大家分享 .NET 控制台程序和 .NET 开发的 WebAPI 及 Web 项目在以 Windows 服务模式部署时的一些注意事项。
.NET 项目想要部署为 Windows 服务,首先需要通过 NuGet 安装 Microsoft.Extensions.Hosting.WindowsServices ,然后在程序启动时做如下配置:
控制台程序:
  1. using Common;
  2. namespace TaskService
  3. {
  4.     class Program
  5.     {
  6.         static void Main(string[] args)
  7.         {
  8.             EnvironmentHelper.ChangeDirectory(args);
  9.             IHost host = Host.CreateDefaultBuilder(args).UseWindowsService()
  10.                 .ConfigureServices((hostContext, services) =>
  11.                 {
  12.                     ///各种服务注入
  13.                 })
  14.                 .Build();
  15.             host.Run();
  16.         }
  17.     }
  18. }
复制代码
 
Web 及 WebAPI 程序:
  1. using Common;
  2. namespace WebAPI
  3. {
  4.     public class Program
  5.     {
  6.         public static void Main(string[] args)
  7.         {
  8.             EnvironmentHelper.ChangeDirectory(args);
  9.             var builder = WebApplication.CreateBuilder(args);
  10.             builder.Host.UseWindowsService();
  11.             //各种服务注入
  12.             var app = builder.Build();
  13.             app.Run();
  14.         }
  15.     }
  16. }
复制代码
 
以上是两种常见程序的启动 Main 函数的配置 Windows 托管模式的演示,其中一个关键点在于 EnvironmentHelper.ChangeDirectory(args); 
该方法用于在服务启动时将运行路径重新指向为程序所在目录,默认情况下 .NET 程序在命令启动时,运行路径为执行命令的路径比如在 cmd 中执行如下命令:

 
虽然程序是放在 d:\Publish\ 文件夹中,但是因为我们执行启动程序命令时的路径是在 c:\User\ZhangXiaoDong 所以程序启动之后的运行环境路径就是 命令执行当前目录,c:\User\ZhangXiaoDong 这时候如果我们的代码中有包含一些涉及到操作 程序所在目录的 IO 操作时就会产生异常,比如 加载 web 项目下的 wwwroot 文件夹中的静态资源,这些都会异常,所以我们需要在程序启动时将 运行目录重定向到 我们的程序所在目录,就用到了 EnvironmentHelper.ChangeDirectory(args);  这个方法。
EnvironmentHelper.ChangeDirectory(args);  实现如下:
  1. using Microsoft.Extensions.Configuration.CommandLine;
  2. namespace Common
  3. {
  4.     /// <summary>
  5.     /// 环境操作Helper方法
  6.     /// </summary>
  7.     public class EnvironmentHelper
  8.     {
  9.         /// <summary>
  10.         /// 改变工作目录
  11.         /// </summary>
  12.         /// <param name="args"></param>
  13.         public static void ChangeDirectory(string[] args)
  14.         {
  15.             var cmdConf = new CommandLineConfigurationProvider(args);
  16.             cmdConf.Load();
  17.             if (cmdConf.TryGet("cd", out string cdStr) && bool.TryParse(cdStr, out bool cd) && cd)
  18.             {
  19.                 Directory.SetCurrentDirectory(AppContext.BaseDirectory);
  20.             }
  21.         }
  22.     }
  23. }
复制代码
主要逻辑是判断启动命令中 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 基础框架项目,项目地址如下https://github.com/berkerdong/NetEngine.githttps://gitee.com/berkerdong/NetEngine.git 
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农民

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表