一文轻松了解ASP.NET与ASP.NET Core多环境配置对比

目录
  • 前言
  • asp.net下的多环境配置
    • 如何增加额外的环境配置
  • aspnetcore下的多环境配置
    • 什么是配置提供程序
    • 开发阶段的多环境
    • 发布阶段的实现多环境配置
    • EnvironmentName 属性
  • 总结

前言

多环境配置应该都很熟悉了,最为常见的环境便是Debug和Release,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成

有些开发者从来没了解过Web.Debug.config和Web.Release.config,始终是一个Web.config文件改来改去来切换不同的配置,但凡有点追求都不能忍受这种煎熬。

asp.net下的多环境配置

双击打开Web.Debug.config和Web.Release.config任何一个,看看里面的内容。

Web.Debug.config
<?xml version="1.0" encoding="utf-8"?>

<!-- 有关使用 Web.config 转换的详细信息,请访问 https://go.microsoft.com/fwlink/?LinkId=301874 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    在下例中,“SetAttributes”转换将更改
    “connectionString”的值,仅在“Match”定位器找到值为“MyDB”的
    特性“name”时使用“ReleaseSQLServer”。

    <connectionStrings>
      <add name="MyDB"
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True"
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <!--
      在以下示例中,"Replace" 转换将替换 Web.config 文件的
      整个 <customErrors> 节。
      请注意,由于在 <system.web> 节点下只有一个
       customErrors 节,因此无需使用 "xdt:Locator" 属性。

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

微软为了让我们使用它,把不仅给出示例,还配上详细的注释,看过注释和示例大概就该知道如何进行配置,覆盖Web.config中的配置。
下面展示下最为常用的appSettings如何配置

  <!--Web.config 开发环境-->
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

    <add key="MyKey" value="Myvalue" />
  </appSettings>
  <!--Web.Release.config 生产环境-->
  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />

    <add key="MyKey" value="Releasvalue" xdt:Transform="Replace" xdt:Locator="Match(key)" />
  </appSettings>

经过这样的配置后,本机开发时读取到MyKey的值为Myvalue,发布生产环境时值为Releasvalue。
按照上面的配置,本地发布程序试试效果。

发布成功后,打开发布后生成的Web.config文件,我们发现开发环境下Web.config中对应的值被替换了,这样开发和生产配置分别配置在不同文件,不需要频繁修改配置文件切换配置了。

如何增加额外的环境配置

有时候Debug和Release两个环境还不能满足我们的需要,需要增加更多的环境配置。

打开菜单生成-->配置管理器,新建一个TEST1环境

然后右键Web.config选择添加配置转换(第四个)

会自动生成一个Web.TEST1.config文件,非常的人性化,然后我们在该文件配置一些参数。

更改发布的配置,进行发布。

打开发布成功后的Web.config文件

效果与预期一致。

aspnetcore下的多环境配置

aspnetcore中的配置文件被appsettings.json所取代,.NET Core中的配置是使用一个或多个配置提供程序执行的。 配置提供程序使用各种配置源从键值对读取配置数据:

什么是配置提供程序

下表显示了 .NET Core 应用可用的配置提供程序。

提供程序 通过以下对象提供配置
Azure 应用配置提供程序 Azure 应用程序配置
Azure Key Vault 配置提供程序 Azure Key Vault
命令行配置提供程序 命令行参数
自定义配置提供程序 自定义源
环境变量配置提供程序 环境变量
文件配置提供程序 JSON、XML 和 INI 文件
Key-per-file 配置提供程序 目录文件
内存配置提供程序 内存中集合
应用机密(机密管理器) 用户配置文件目录中的文件

详细内容参考 .NET 中的配置
https://docs.microsoft.com/zh-cn/dotnet/core/extensions/configuration

其中以下部分比较值得注意

划重点:后来添加的配置提供程序会替代之前的密钥设置
appsettings.Development.jsonappsettings.json后加载,则后加载的会覆盖先加载配置的值,没毛病!

多环境配置文件时如何加载

为了彻底弄清楚底层加载逻辑,下载源码一探究竟。

builder.ConfigureAppConfiguration((hostingContext, config) =>
        {
            var env = hostingContext.HostingEnvironment;

            config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                  .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

            if (env.IsDevelopment())
            {
                if (!string.IsNullOrEmpty(env.ApplicationName))
                {
                    var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
                    if (appAssembly != null)
                    {
                        config.AddUserSecrets(appAssembly, optional: true);
                    }
                }
            }

            config.AddEnvironmentVariables();

            if (args != null)
            {
                config.AddCommandLine(args);
            }
        })

默认的WebHostBuilder实现中,用环境变量env.EnvironmentName值拼接的json文件进行加载。这也是为什么开发阶段会加载appsettings.Development.json配置文件的原理。

开发阶段的多环境

如何传参修改环境变量EnvironmentName值是问题的关键,若能修改想要的值,然后创建对应名称的配置文件即可。

在web根目录存在一个文件:Properties/launchSettings.json

其中有一个配置环境变量的配置

"environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development"
},

本地开发时只需要创建多个启动配置,分别设置不同的ASPNETCORE_ENVIRONMENT即可进行切换了,修改后的launchSettings.json

// launchSettings.json
{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:2364",
      "sslPort": 44302
    }
  },
  "profiles": {
    "Web1": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "https://localhost:7006;http://localhost:5006",
      "dotnetRunMessages": true
    },
    "Web1:Test": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "TEST"
      },
      "applicationUrl": "https://localhost:7006;http://localhost:5006",
      "dotnetRunMessages": true
    }
  }
}

Web1和Web1:Test启动选项便会同步显示在VS启动选项中,切换为Web1:Test再运行程序,就会加载appsettings.TEST.json,效果和appsettings.Development.json没区别。

发布阶段的实现多环境配置

在上文中我们学会了在本地配置多个不同环境配置进行开发,那如果需要发布的生产环境也有很多种配置,那如何让程序自动加载不同的配置文件呢,毕竟launchSettings.json文件只是在开发时搭配VS用的,既然launchSettings.json可以配置环境变量,没了它我们手动创建环境变量应该也可以。在操作系统添加环境变量如:

也可以在程序启动时通过命令行传参设置环境值。

但是这两种我都感觉不方便,我们希望程序根据不同的环境发布好以后,只需要直接执行就好,而不是需要进行额外的配置或传参。

EnvironmentName 属性

在项目的工程文件中有EnvironmentName属性,可以指定当前EnvironmentName值,添加如下代码

然后编译后的,直接运行,就能够读取到appsettings.TEST.json配置文件。

这配置不会覆盖launchSettings.json中指定的环境值,但在影响发布后的EnvironmentName值,从而可以改变实现发布后默认的EnvironmentName值。

那这样设置后,岂不是发布后的EnvironmentName值只能是Test,如果要发布其他环境还要每次发布前修改这个值,那不是很麻烦吗?

没错如果没有点其他手段,那这真是多此一举啊,请看下图。

懂了吧,我们只需要多配置一个PublishProfile发布文件,指定不同的配置项,然后结合Condition条件来控制EnvironmentName。

至此,完美实现根据不同环境选择不同的发布文件,进行发布项目,目标机器不需要做任何配置,直接运行就是我们想要的效果。

总结虽然ASP.NET和ASP.NETCore实现多环境的方式不同,但是最后发布时我们可以做到一样的效果,所有的配置都是一次性的,发布时指定对应的PublishProfile即可。

总结

到此这篇关于ASP.NET与ASP.NET Core多环境配置对比的文章就介绍到这了,更多相关ASP.NET ASP.NETCore多环境配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • ASP.NET Core中使用多环境

    ASP.NET Core 支持在多个环境中管理应用程序,如开发(Development),预演(Staging)和生产(Production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当地配置. 1.环境变量 ASP.NET Core 引用一个特定的环境变量 ASPNETCORE_ENVIRONMENT 来描述应用程序当前运行的环境.这个变量可以被设置任何值,但是有三个值被约定使用:Development(开发),Staging(预演)和Production(生产). 当前环境变量

  • 一文轻松了解ASP.NET与ASP.NET Core多环境配置对比

    目录 前言 asp.net下的多环境配置 如何增加额外的环境配置 aspnetcore下的多环境配置 什么是配置提供程序 开发阶段的多环境 发布阶段的实现多环境配置 EnvironmentName 属性 总结 前言 多环境配置应该都很熟悉了,最为常见的环境便是Debug和Release,例如下图是新建的一个asp.net项目,配置文件展开共有三个文件组成 有些开发者从来没了解过Web.Debug.config和Web.Release.config,始终是一个Web.config文件改来改去来切换

  • ASP.NET、ASP、PHP、JSP之间有什么区别?

    Asp:      首先说Asp,它是属于脚本语言,一般连接的数据库为 Access 和 MsSql(SqlServer).当我们开发一个一般的小型数据库网站的时候,一般在3万条记录以下的,一般用Access数据库.      Access数据库的优势就是一般的服务器都支持.      SqlServer数据库的优势就是速度快,比如当记录集在10万以上,可以推荐用Sql的数据库. 这两种数据库在Asp中都是用Sql语法,但Access数据库和SqlServer数据库的使用语法有一定的不同. 在制

  • Win7中IIS的ASP.NET环境配置简洁版

    工作中需要在Win7中使用IIS搭建ASP.NET的网站,这里分享下配置中的小问题. siyue最开始自己配了一遍,发现使用IIS运行ASP.NET网站时一直报错,想到自己可能配置的有问题,于是上网找点资料看看. 发现有个朋友对这个进行了详细的设置,非常好的介绍,我这里只是稍微总结下,好让自己记得更清楚. 详细内容传送门:Win7旗舰版中的IIS配置asp.net的运行环境 siyue觉得在Win7上配置IIS,一般的安装IIS和建立网站都没问题,(不过要运行ASP必须在开发工具那里安装ASP.

  • VS2015 搭建Asp.net core开发环境的方法

    前言 随着ASP.NET Core 1.0 rtm的发布,网上有许多相关.net core 相关文章,最近正好有时间就尝试VS2015 搭建Asp.net core开发环境,以下是简单的搭建过程,下面来一起看看吧. 步骤如下 一.首先你得装个vs2015 并且保证已经升级至 update3及以上(此处附上一个vs2015带up3的下载链接: ed2k://|file|cn_visual_studio_enterprise_2015_with_update_3_x86_x64_dvd_892329

  • 详解ASP.NET与ASP.NET Core用户验证Cookie并存解决方案

    在你将现有的用户登录(Sign In)站点从ASP.NET迁移至ASP.NET Core时,你将面临这样一个问题--如何让ASP.NET与ASP.NET Core用户验证Cookie并存,让ASP.NET应用与ASP.NET Core应用分别使用各自的Cookie?因为ASP.NET用的是FormsAuthentication,ASP.NET Core用的是claims-based authentication,而且它们的加密算法不一样. 我们采取的解决方法是在ASP.NET Core中登录成功

  • 解读ASP.NET 5 & MVC6系列教程(4):核心技术与环境配置

    asp.net 5是下一代的asp.net,该版本进行了全部重写以适用于跨平台,新新版本中,微软引入了如下工具与命令:DNVM.DNX.DNU. DNVM(.NET Version Manager):由于要实现跨平台的目录,微软提供了DNVM功能,DNVM是ASP.NET最底层的内容,他是一组Powershell脚本,用于启动指定版本的ASP.NET运行环境,并且可以在同一台机器的同一时间点上通过使用Nuget工具来管理各种版本的ASP.NET运行环境(DNX),以及进行相应的升级操作. DNX

  • win2008 r2 服务器环境配置(FTP/ASP/ASP.Net/PHP)

    以下是FTP/ASP/PHP/ASP.Net环境配置 一.FTP与ASP安装流程通过远程登录VPS,点击计算机管理>角色1.1首先我们选择自己需要装的配置环境ASP与FTP,所以只要在前面打勾再安装就可以了 1.2:需要安装的配置,确认安装 1.3:安装完成 二.安装PHP环境2.1首先我们通过在线平台安装PHP所需要的软件配置 2.2进入平台>产品>框架>选择PHP5.3.8与Windows Cache Extension 1.1 for PHP 5.3安装 2.3安装确认 2.

  • asp.net php asp jsp 301重定向的代码(集合)

    1.Linux主机重定向 Godaddy的Liunx主机,Godaddy本身已经支持Apache,所以直接创建一个.htaccess文件就可以了,一般来说,在本地无法创建.htaccess的时候可以先创建一个txt格式文件,上传到根目录的时候再重命名为".htaccess"就可以了.网上很多如何进行 301重定向的教程,无论是整站重定向还是单页重定向.下面就以我的www.jb51.net为例 1.1 无www域名转移到www域名 复制代码 代码如下: RewriteEngine on

  • Ajax+ASP和Flash+ASP数据读取取方法有些相似的实现方法

    Ajax+ASP和Flash+ASP数据存取方法两种数据存取方法差不多.===============================下面是一个ChatRoom的Ajax部分代码:var ajaxHttpRequest = false;function ajaxInit() { if(window.XMLHttpRequest) { //Mozilla, Opera, ...  ajaxHttpRequest = new XMLHttpRequest();  if(ajaxHttpRequest

  • Asp.Net、asp实现的搜索引擎网址收录检查程序

    使用asp.net或者asp检查某个url地址,某篇文章是否被搜索引擎,如百度,谷歌,搜狗收录. 实现原理:直接搜索你那篇文章的url地址(不带协议,但上协议也行,代码会自动去掉协议内容),如果被索引会返回搜索结果,否则会提示找不到信息. Asp.Net检查百度,谷歌,搜狗搜索引擎是否收录文章网址源代码: using System; using System.Net; using System.Text; using System.IO; using System.Web; public cla

随机推荐