.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

这篇具有很好参考价值的文章主要介绍了.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

〇、前言

日常开发中,程序的环境切换是相当频繁的了,如果不同环境中的某些参数不同,那就需要每次编辑之前手动进行修改,比较麻烦,效率低下。

本文将以 .NET Core WebAPI 项目的配置方法为例,分步骤实现根据环境变量的配置参数,自动读取对应配置文件中的特殊参数值,从而达到 Development、Staging、Production 三种环境的无感部署。

一、配置文件

程序一般默认只有一个配置文件:appsettings.Development.json。

需要手动添加另外两个:appsettings.Staging.json、appsettings.Production.json。

 原配置文件中,默认只有一个节点:Logging,如下:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

 需要手动添加一个与 Logging 同级的节点,名称自定义,如下示例:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "MyPara": {
    "myparavalue": "测试文本",
    "myparavalue2": [
      {
        "key": "111",
        "value": "v111"
      },
      {
        "key": "222",
        "value": "v222"
      },
      {
        "key": "333",
        "value": "v333"
      }
    ]
  }
}

注意,三个配置文件中需要加上完全一样的参数名称,然后根据环境不同配置不同的值。

二、程序读取配置

1. 配置文件信息读取实现

接下来就是在程序中配置读取了,在控制器的构造函数添加环境判断,然后取出配置文件中新增节点的值备用。

以下实例,包含了读取 字符值、列表值 两种:

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;

[Route("api/[controller]/[action]")]
[ApiController]
public class SystemConfigController : ControllerBase // SystemConfig
{
    public static IConfigurationRoot configurationRoot = null;
    // 示例只有两个字段,就用字典 Dictionary 来演示了,若字段较多时,可用实体对象 list
    public static Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();
    public SystemConfigController(IWebHostEnvironment env)
    {
        try
        {
            configurationRoot = AppConfigure.GetConfigurationRoot(env.ContentRootPath, env.EnvironmentName);
            if (keyValuePairs.Count == 0) // 仅首次加载时读取
            {
                string flag = string.Empty;
                int i = 0;
                while (flag != null)
                {
                    var keyinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:key"];
                    var valueinfo = configurationRoot[$"MyConfigPara:myparavalue2:{i}:value"];
                    if (keyinfo != null && valueinfo != null)
                    {
                        keyValuePairs.Add(keyinfo, valueinfo); // 加入字典
                        i++;
                    }
                    else
                        flag = null;
                }
            }
        }
        catch (Exception ex)
        {
            // 日志框架记录日志
        }
    }
    public void TestAction()
    {
        // 读取配置文件具体值
        string myparavalue = configurationRoot["MyPara:myparavalue"];
    }
}

配置文件读取帮助类:AppConfigure.cs。

using Microsoft.Extensions.Configuration;
using System.Collections.Concurrent;

public static class AppConfigure
{
    // 缓存字典
    private static readonly ConcurrentDictionary<string, IConfigurationRoot> _cacheDict;
    static AppConfigure()
    {
        _cacheDict = new ConcurrentDictionary<string, IConfigurationRoot>();
    }
    // 传入 JSON 文件夹路径与当前的环境变量值
    public static IConfigurationRoot GetConfigurationRoot(string jsonDir, string environmentName = null)
    {
        // 设置缓存的 KEY
        var cacheKey = $"{jsonDir}#{environmentName}";
        // 添加默认的 JSON 配置
        var builder = new ConfigurationBuilder().SetBasePath(jsonDir)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
        // 根据环境变量添加相应的 JSON 配置文件
        if (!string.IsNullOrEmpty(environmentName))
        {
            builder = builder.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true);
        }
        // 返回构建成功的 IConfigurationRoot 对象
        return builder.Build();
    }
}

2. 关于本机测试

可以通过修改项目的初始设置文件(文件夹下 Properties-->launchSettings.json)修改当前的运行环境,也可以在项目属性的“Debug”中修改,效果是一样的,如下:

{
  "$schema": "http://json.schemastore.org/launchsettings.json",
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:40493",
      "sslPort": 44360
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development" // 修改切换运行环境:Development、Production、Staging
      }
    },
    "Finance.ReconciliationPlatform": {
      "commandName": "Project",
      "dotnetRunMessages": "true",
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "applicationUrl": "https://localhost:5001;http://localhost:5000",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}

  .NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

注意:launchSettings.json 文件,仅用于本地开发计算机,不会被编译发布到生产环境,因此不能存储重要信息。

三、Windows 服务器配置

最后就是配置 Windows 服务器的环境变量了,用来标识程序运行的环境。

如下图,根据需要配置不同的环境变量:

  • ASPNETCORE_ENVIRONMENT:Development
  • ASPNETCORE_ENVIRONMENT:Staging
  • ASPNETCORE_ENVIRONMENT:Production

注意:此方法配置的是服务器的环境变量,针对的是整台机器的环境类型,若需求是在同一台机器上配置多类型的程序,请参考后边章节。

.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

至此,就配置完成了。

四、如何在同一台服务器 部署 两种不同环境 的服务?

1、修改 Startup.cs 代码,固定运行环境

通过在 Startup.cs 文件的 Configure() 方法中,赋值环境名称(EnvironmentName),以实现灵活控制程序的环境。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    env.EnvironmentName = "Production";
    if (env.IsProduction()) // true
    {
        // 。。。
    }
}

2、通过 IIS 配置服务的环境变量

通过 IIS 配置环境变量,也是区分生效范围的:

  • 若直接在根目录的“配置编辑器”中配置,则其下的服务将是同一环境类型;(后续更新服务后值不变)
  • 若针对单个服务的“配置编辑器”配置,则仅针对当前服务。(缺点:每次服务更新后,需重新配置)

注意,针对服务的环境配置优先级,高于根目录的配置。继承来的环境配置无法修改,要配置其他的环境,需要新增。

如下配置步骤:

(配置管理器 --> 根据路径查找 system.webServer/aspNetCore --> system.webServer/aspNetCore --> 编辑项ASPNETCORE_ENVIRONMENT填入指定的环境值Production、Staging、Development

.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署

项路径中另加服务名称的就是在当前服务新增的,另外一个则是从根目录继承来的,当前新增的优先级较高。文章来源地址https://www.toymoban.com/news/detail-468214.html

到了这里,关于.NET Core 程序实现 Windows 系统 Development、Staging、Production 三种环境的无感部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 运行flask报WARNING: This is a development server. Do not use it in a production deployment.

    运行 flask 程序,报: WARNING: This is a development server. Do not use it in a production deployment. 解决方案一,使用PyWSGI(不推荐) 1. 下载gevent包:在控制台输入: pip install gevent 2. 修改 flask 启动代码: 解决方案二,虽然 PyWSGI 服务器相对轻量并且易于设置,但许多人更倾向于使用像 Gun

    2024年02月07日
    浏览(29)
  • 使用flask,关于WARNING: This is a development server. Do not use it in a production deployment问题

    当flask开发web服务,本地开发完成后,部署线上环境,运行,也会和本地一样,控制台会打印以下信息: WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. 提示信息很明显,意思就是在生产环境,不要再用这种方式运行程序,最好用W

    2024年02月16日
    浏览(25)
  • .NET Core 实现日志打印输出在控制台应用程序中

    在本文中,我们将探讨如何在 .NET Core 应用程序中将日志消息输出到控制台,从而更好地了解应用程序的运行状况。 在 .NET Core 中,日志输出打印是使用 Microsoft.Extensions.Logging 命名空间中的类和方法实现的。首先,我们需要确保在项目中添加了以下必要的依赖包: Microsoft.Ex

    2024年02月11日
    浏览(47)
  • 使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性

    集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行更改。这样可以提高应用程序的灵活性和可维护性。 ASP.NET Core 提供了一种灵活的配置系统,可以轻松地将配置信息从不同的来源加载到应用程序中,并且可以根

    2024年02月01日
    浏览(53)
  • 基于.Net Core实现的飞书所有文档一键导出服务(支持多系统)

    一个支持Windows、Mac、Linux系统的飞书文档一键导出服务,仅需一行命令即可将飞书知识库的全部文档同步到本地电脑。支持导出 markdown , docx , pdf 三种格式。导出速度嘎嘎快,实测 700 多个文档导出只需 25 分钟,且程序是后台挂机运行,不影响正常工作。查看最新更新 最近

    2024年02月12日
    浏览(40)
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十)

    abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)   abp(net core)+easyui+efcore实现仓储管理系统——定义仓储并实现 (四) abp(net core)+easyui+efcore实

    2023年04月09日
    浏览(40)
  • abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级之上(六十一)

      A bp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)   abp(net core)+easyui+efcore实现仓储管理系统—

    2023年04月16日
    浏览(36)
  • abp(net core)+easyui+efcore实现仓储管理系统——组织管理升级之下(六十二)

    A bp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)   abp(net core)+easyui+efcore实现仓储管理系统——

    2023年04月23日
    浏览(33)
  • 《深入浅出.NET框架设计与实现》笔记6.2——ASP.NET Core应用程序多种运行模式之二——IIS 服务承载

     ASP.NET Core应用程序可以在多种运行模式下运行,包括自宿主(Self-Hosting)、IIS服务承载、桌面应用程序、服务承载。 因此选择和时的模式很重要。 IIS 服务承载 将 ASP.NET Core 应用程序托管在 Internet Information Services (IIS) 中。 利用 IIS 提供的高级功能,如负载均衡、HTTPS 支持和

    2024年04月26日
    浏览(33)
  • abp(net core)+easyui+efcore实现仓储管理系统——供应商管理升级之下(六十四)

    a bp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三)   abp(net core)+easyui+efcore实现仓储管理系统——

    2024年02月03日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包