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

 更新时间:2022年09月16日 08:24:07   作者:张晓栋  
这篇文章主要介绍了.NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

日常工作中有时候会遇到需要将程序直接在服务器上运行,而不依赖于 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 基础框架项目,项目地址如下

https://github.com/berkerdong/NetEngine.git

https://gitee.com/berkerdong/NetEngine.git

到此这篇关于.NET 实现启动时重定向程序运行路径及 Windows 服务运行模式部署的文章就介绍到这了,更多相关.NET  Windows 服务运行模式部署内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Razor TagHelper实现Markdown转HTML的方法

    Razor TagHelper实现Markdown转HTML的方法

    下面小编就为大家分享一篇Razor TagHelper实现Markdown转HTML的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • asp.net 利用IIS的404错误将文件重写成目录的简单方法

    asp.net 利用IIS的404错误将文件重写成目录的简单方法

    为什么要把文件重写成目录,主要原因是讨好搜索引擎,至于为什么写成目录搜索引擎就比较容易搜录不在本文讨论范围之内。
    2009-09-09
  • asp.net C#实现解压缩文件的方法

    asp.net C#实现解压缩文件的方法

    这篇文章主要介绍了asp.net C#实现解压缩文件的方法,分别讲述了三种不同的实现方法,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • MVC 5限制所有HTTP请求必须是POST方式

    MVC 5限制所有HTTP请求必须是POST方式

    这篇文章主要为大家详细介绍了MVC 5限制所有HTTP请求必须是POST方式的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • ASP.NET Cache的一些总结分享

    ASP.NET Cache的一些总结分享

    最近我们的系统面临着严峻性能瓶颈问题,这是由于访问量增加,客户端在同一时间请求增加,这迫使我们要从两个方面解决这一问题,增加硬件和提高系统的性能
    2012-08-08
  • c# 读取文件内容存放到int数组 array.txt

    c# 读取文件内容存放到int数组 array.txt

    c# 读取文本的内容,并且将内容保存到int数组中,大家可以学习到c#一些数组跟读取内容的函数。
    2009-04-04
  • ASP.NET Core Web中使用AutoMapper进行对象映射

    ASP.NET Core Web中使用AutoMapper进行对象映射

    AutoMapper是一个简单易用的.NET对象映射库,用于快速、方便地进行对象之间的转换和映射,极大的简化了开发人员在处理对象映射时的工作量,今天我们来讲讲在ASP.NET Core Web中使用AutoMapper快速进行对象映射,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • asp.ent下合并两个结构相同的DataTable

    asp.ent下合并两个结构相同的DataTable

    今天遇到了一个情况,就是从一张数据表中读取几个符合条件1的客户的信息,然后再读取几个符合条件2的客户的信息,最后显示出来.因为前后两次数据的客户信息的结构是完全相同的,所以干脆合并成一个DataTable再赋值给GridView好了.
    2010-02-02
  • ASP.NET MVC使用母版页视图

    ASP.NET MVC使用母版页视图

    这篇文章介绍了ASP.NET MVC使用母版页视图的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • WPF实现流光动画特效

    WPF实现流光动画特效

    这篇文章介绍了WPF实现流光动画特效的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论