ASP.Net Core MVC基础系列之环境设置

上一节我们介绍了中间件的基本使用, 这一节我们讲一讲.Net Core的环境设置, 以及根据不同的环境加载不同的配置信息

PS: 由于最近一直比较忙, 一直没抽时间更新这个系列, 最近居多的博友催我, 所以继续挤挤时间更新这个系列, 感谢大家的对本系列教程的喜欢和支持.

在实际开发中, 我们的系统往往会是至少两个以上的运行环境, 最基本的就是, 开发环境和运营环境, 体系完整的公司, 还会有测试环境, 预发布环境, 和一些自定义环境等等, 这些环境使用的配置或是一些参数肯定是不一样的, 我们不可能为一个环境准备一份代码, 我们可以通过环境配置, 和 一些 if 判断, 就可以做到环境的自动切换, 下面就仔细说说.

我们先通过默认的.Net Core MVC设置, 感受一下. 以前的代码找不到了, 新建一个空的.Net Core MVC项目吧, 代码后面会提供下载.

PS: IDE我已经使用VS2019

建好之后, 我们打开Startup.cs代码文件, 看Configure方法, 我相信, 有的博友已经发现了, 里面的第一行代码是个if, 意思就是判断当前环境是不是开发环境, 看单词的字面意思也是这个意思, 所以学好英文对开发程序有很大的buff加成啊~~~

对于if里的是什么, 上一节已经讲过, 不再称述.

由此我们得出, 控制环境和判断环境, 都是在Configure方法中, 注入的IHostingEnvironment接口对象进行的. 这里我说一下, 系统默认提供的几个判断环境的方法. 我们使用env.Is, VS的智能提示, 可以得到下面四个方法, 如图:

  • IsDevelopment方法大家已经知道了, 判断当前是不是开发环境.
  • IsProduction方法, 判断当前是不是运营(正式)环境
  • IsStaging方法, 判断当前是不是预运行环境
  • IsEnvironment方法, 根据传入的环境名称, 判断是不是当前环境类型 (用于自定义环境判断)

我们修改一下Configure方法的代码, 修改后为:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/plain;charset=utf-8";  //防止WriteAsync方法输出中文乱码
        if (env.IsDevelopment())
        {
            await context.Response.WriteAsync("开发环境", Encoding.UTF8);
        }
        else if (env.IsProduction())
        {
            await context.Response.WriteAsync("运营环境", Encoding.UTF8);
        }
        else if (env.IsStaging())
        {
            await context.Response.WriteAsync("预发布环境", Encoding.UTF8);
        }
        else
        {
            await context.Response.WriteAsync("自定义环境", Encoding.UTF8);
        }
    });
}

然后F5运行, 浏览器会不出意外的输出: "开发环境"

没毛病, 我们修改一下编译环境, 把Debug修改为Release, 然后生成, 如图:

然后生成项目, 生成成功之后, 到项目的bin/Release/netcoreapp2.2目录下, 打开CMD, 执行dotnetUnit1.dll命令, 就会是这样的, 如图:

我们在浏览器输入http://localhost:5000/回车, 不出意外, 会输出: 运营环境 四个大字.

以上的流程, 就演示了最基本的开发环境和运营环境的配置和判断. 下面我们演示自定义环境. 我们接着修改代码, 为当前环境设置个名字, 代码如下

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    env.EnvironmentName = "Cus";    //设置自定义环境名称

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/plain;charset=utf-8";  //防止WriteAsync方法输出中文乱码
        if (env.IsDevelopment())
        {
            await context.Response.WriteAsync("开发环境", Encoding.UTF8);
        }
        else if (env.IsProduction())
        {
            await context.Response.WriteAsync("运营环境", Encoding.UTF8);
        }
        else if (env.IsStaging())
        {
            await context.Response.WriteAsync("预发布环境", Encoding.UTF8);
        }
        else
        {
            await context.Response.WriteAsync("自定义环境", Encoding.UTF8);
        }
    });
}

F5运行项目, 浏览器毫不意外的输出了: 自定义环境

如果我们要输出预发布环境的话, 只需要把EnvironmentName 属性的值改成 "Staging" 即可, 这里不做演示, 自行尝试, 设置代码如下:

env.EnvironmentName = "Staging"; //设置为预发布环境

发设置为Staging和其它值的区别就是系统系统了一个IsStaging方法

为了更加直观的演示自定义环境, 我们把else改一下, 改完之后的代码如下:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    env.EnvironmentName = "Cus";    //设置自定义环境名称

    app.Run(async (context) =>
    {
        context.Response.ContentType = "text/plain;charset=utf-8";  //防止WriteAsync方法输出中文乱码
        if (env.IsDevelopment())
        {
            await context.Response.WriteAsync("开发环境", Encoding.UTF8);
        }
        else if (env.IsProduction())
        {
            await context.Response.WriteAsync("运营环境", Encoding.UTF8);
        }
        else if (env.IsStaging())
        {
            await context.Response.WriteAsync("预发布环境", Encoding.UTF8);
        }
        else
        {
            if (env.IsEnvironment("Cus"))
            {
                await context.Response.WriteAsync("自定义环境: Cus", Encoding.UTF8);
            }
            else if (env.IsEnvironment("Cus1"))
            {
                await context.Response.WriteAsync("自定义环境: Cus1", Encoding.UTF8);
            }
            else
            {
                await context.Response.WriteAsync($"自定义环境: {env.EnvironmentName}", Encoding.UTF8);
            }
        }
    });
}

具体运行效果和预计的一样, 会输出对应的自定义环境

但是实际开发过程中, 我不推荐在代码里面修改当前环境, 而且通过项目的环境变量设置对应的环境, 具体修改方法如下

1: 点开Properties

2: 打开launchSettings.json

3: 修改ASPNETCORE_ENVIRONMENT的值.

我们修改EnvironmentName属性的代码删掉, 修改launchSettings.json的配置为Cus, 运行是什么效果, 修改后的效果如图

没出任何以外, 浏览器输出的是自定义环境: Cus, 改成其它的值, 就输入对应的自定义环境, 修改为Development就是开发环境,Staging就是预运营环境,Production就是运营环境

可能有人就要问了, 你只修改了上面的ASPNETCORE_ENVIRONMENT, 下面还有一个ASPNETCORE_ENVIRONMENT配置, 没修改, 怎么也可以. 别急, 马上就说明

.Net Core MVC程序, 提供了两种托管方式, 一种是通过IIS托管, 一种是自托管, 我们刚刚修改的环境, 只修改了IIS托管模式, VS默认又是IIS调试, 所以, 会有效果

如果使用自托管模式调试或发布运行程序, 则修改下面的Unit1节点的配置即可. 当然, VS也提供了调试方式, 切换方法, 点击运行模式即可, 如图:

选择Unit1, 就是自托管模式啦~ , 然后F5运行, 浏览器输出的依然是开发环境, 虽然IIS配置的是Cus环境, 但是Unit1自托管没有修改, 我们修改一下Unit1的环境试试, 这里我修改为Cus100, 然后选择Unit1调试, F5运行, 浏览器输出的就是

没有任何问题

如果你觉得这种修改方式麻烦, 还有一种界面修改方法

我们在项目上右键 --> 属性 --> 调试, 就能看到对应的配置了, 如图:

当前是自托管模式, 我修改为Cus100, 这里显示的就是Cus100, 点击上面的配置文件, 还可以修改不同的托管模式的配置:

这里就不做演示了, 修改效果和直接修改launchSettings.json文件是一样的

PS: 我们已经把两种托管模式的环境都设置为了默认的Development, 开发环境.

上面已经讲完了环境的配置和切换, 下面讲讲根据不同的环境, 自动读取不同的配置文件, 我们先修改一下代码, 让输入的文件是从appsettings.json配置里面读取的, 修改后的Startup类代码如下:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System.Text;

namespace Unit1
{
    public class Startup
    {
        private readonly IConfiguration _Configuration;

        /// <summary>
        ///
        /// </summary>
        /// <param name="configuration">注入或者配置文件的接口对象</param>
        public Startup(IConfiguration configuration)
        {
            this._Configuration = configuration;
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            //env.EnvironmentName = "Cus1";    //设置自定义环境名称

            app.Run(async (context) =>
            {
                context.Response.ContentType = "text/plain;charset=utf-8";  //防止WriteAsync方法输出中文乱码
                var msg = this._Configuration.GetValue<string>("hello");
                await context.Response.WriteAsync(msg, Encoding.UTF8);
                /*if (env.IsDevelopment())
                {
                    await context.Response.WriteAsync("开发环境", Encoding.UTF8);
                }
                else if (env.IsProduction())
                {
                    await context.Response.WriteAsync("运营环境", Encoding.UTF8);
                }
                else if (env.IsStaging())
                {
                    await context.Response.WriteAsync("预发布环境", Encoding.UTF8);
                }
                else
                {
                    if (env.IsEnvironment("Cus"))
                    {
                        await context.Response.WriteAsync("自定义环境: Cus", Encoding.UTF8);
                    }
                    else if (env.IsEnvironment("Cus1"))
                    {
                        await context.Response.WriteAsync("自定义环境: Cus1", Encoding.UTF8);
                    }
                    else
                    {
                        await context.Response.WriteAsync($"自定义环境: {env.EnvironmentName}", Encoding.UTF8);
                    }
                }*/
            });
        }
    }
}

然后我们在appsettings.json配置中, 新增一行:"hello": "appsettings.json", 如图:

F5执行, 浏览器输出了appsettings.json, 没问题

然后我们点一下appsettings.json文件前面的箭头, 会发现里面还有个appsettings.Development.json文件, 如图:

打开appsettings.Development.json文件, 在里面和配置appsettings.json一样, 添加个hello配置, 把值设置为appsettings.Development.json, 如图:

然后再F5运行, 浏览器输出的就是appsettings.Development.json啦~, 这里的原因, 前面章节已经讲过, 这里不再称述.

我们新建个appsettings.Cus.json文件, 然后在里面加个hello配置, 值为appsettings.Cus.json, 如图:

然后再修改运行环境为Cus, 修改方法参考上面, 然后F5运行, 浏览器就输出appsettings.Cus.json啦~

到这里, 这一节就结束了, 到目前为止, 我们对.Net Core MVC的环境和配置文件切换, 有了一个比较熟悉的了解了, 可以实际运用一下了, 再也不用担心不同环境不同的配置搞混了

本节代码:下载

到此这篇关于ASP.Net Core MVC基础系列之环境设置的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET Core MVC基础学习之局部视图(Partial Views)

    1.什么是局部视图 局部视图是在其他视图中呈现的视图.通过执行局部视图生成的HTML输出呈现在调用视图中.与视图一样,局部视图使用 .cshtml 文件扩展名.当希望在不同视图之间共享网页的可重用部分时,就可以使用局部视图. 2.什么时候使用局部视图 局部视图是将大视图分成小组件的有效方法.通用的布局元素应在 _Layout.cshtml 中指定,非布局可重用内容可以封装成局部视图. 如果一个由几个逻辑部分组成的复杂页面,那么将每个逻辑部分作为局部视图是很有用.布局视图与普通视图之间没有语义差别

  • ASP.Net Core MVC基础系列之服务注册和管道

    想必大家都知道ASP.Net Core MVC默认自带了DI容器的, 我们可以很方便的进行使用, 来方便管理对象和生命周期, 那么这一节我就会详细讲解服务注册, 顺便简单讲解一下管道, 让大家知道了基本的MVC运行流程. 回顾一下上一节的内容, 我们从配置文件中获取了输出的字符, 也介绍各个配置的 "优先级" (其实是配置覆盖), 那么我们这一节以服务的方式输出这个字符串, 然后用过DI进行注册服务, 快速了解服务注册. DI容器呢, 依赖接口, 所以我们先新建一个接口, 就叫 IWe

  • ASP.Net Core MVC基础系列之项目创建

    一 : 系列教程环境介绍 1: 操作系统, Windows 10 专业版 64位 (版本号: 1809) 2: IDE使用Visual Studio 2017专业版 (版本号: 15.9.5) 3: SDK环境 .Net Core 2.2.101 4: 前端 Vue 2.X 5: 数据库 MSSQL 2017 6: 语言使用 C# 7.3 二 : .Net Core 2.2环境安装 进行.Net Core开发, 需要安装.Net Core SDK, 下载地址 下载安装完成之后在CMD里面运行do

  • asp.net mvc core管道及拦截器的理解

    今天来看一下asp.net core的执行管道.先看下官方说明: 从上图可以抛光,asp.net core的执行顺序是,当收到一个请求后,request请求会先经过已注册的中间件,然后会进入到mvc的拦截器管道: 进入mvc管道后,根据以上顺序执行过滤校正. OK,根据以上说明下面我们新建一个MVC的演示,将执行方式切换为控台运行: // This method gets called by the runtime. Use this method to add services to the

  • ASP.NET Core MVC学习之视图组件(View Component)

    1.视图组件介绍 视图组件是 ASP.NET Core MVC 的新特性,类似于局部视图,但它更强大.视图组件不使用模型绑定,并且仅依赖于调用它时所提供的数据. 视图组件特点: 呈块状,而不是整个响应 包括在控制器和视图之间发现的相同的关注点和可测试性优点 可以拥有参数和业务逻辑 通常从布局页面调用 视图组件可以用在任何需要重复逻辑且对局部视图来说过于复杂的情况,例如: 动态导航菜单 标签云(需要查询数据库) 登录面板 购物车 最近发表的文章 典型博客上的侧边栏内容 将在每个页面上呈现的登录面板

  • ASP.NET Core MVC/WebApi基础系列2

    >前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之久,人总有懒惰的时候,时间越长越懒惰,但是呢,不学又不行,持续的惰性是不行dei,要不然会被时光所抛弃,技术所淘汰,好吧,进入今天的主题,本节内容,我们来讲讲.NET Core当中的模型绑定系统.模型绑定原理.自定义模型绑定.混合绑定.ApiController特性本质,可能有些园友已经看过,但是效果不太好哈,这篇是解释最为详细的一篇,建议已经学过我发布课程的童鞋也看下,本篇内容略长,请保持耐心,我只讲你们会用到的或者

  • ASP.Net Core MVC基础系列之获取配置信息

    这一节, 我们来讲解.Net Core 是怎么获取配置信息的. .Net Core配置信息来源主要有以下几种 1.appsettings.json文件 2. User Secrets 3. 环境变量 4. 命令行参数 5. 自定义XML等等 在我们上一节新建的项目中, 已经默认有appsettings.json文件了, 并且appsettings.json默认会加载到项目中来, 至于为什么会默认加载, 我们可以通过源码进行分析, VS2017反编译不好用, F12看不到完整的代码, 这里我使用I

  • ASP.NET Core MVC学习教程之路由(Routing)

    前言 ASP.NET Core MVC 路由是建立在ASP.NET Core 路由的,一项强大的URL映射组件,它可以构建具有理解和搜索网址的应用程序.这使得我们可以自定义应用程序的URL命名形式,使得它在搜索引擎优化(SEO)和链接生成中运行良好,而不用关心Web服务器上的文件是怎么组织的.我们可以方便的使用路由模板语法定义路由,路由模板语法支持路由值约束,默认值和可选值. 基于约束的路由允许全局定义应用支持的URL格式,以及这些格式是怎样各自在给定的控制器中映射到指定的操作方法(Action

  • ASP.NET Core MVC/WebApi基础系列1

    >前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时间也是一直在看ASP.NET Core的内容,所以后续会穿插讲EF Core和ASP.NET Core,别认为你会用ASP.NET Core就自认为你很了解ASP.NET Core,虽说是基础系列但也是也有你不知道的ASP.NET Core. UseStaticFiles.UseDefaultFiles.UseDirectoryBrowser.UseFileServer 当我们创建默认.NET Core We

  • ASP.Net Core MVC基础系列之中间件

    上一节我们介绍了服务注册和基本的管道执行流程, 并且讲到了中间件, 这一节我们就来详细谈谈中间件这个东西 讲中间件, 其实就是讲Startup类里面的ConfigureServices 和Configure 这两个方法 在程序启动类Program 中, 我们在CreateWebHostBuilder 方法中调用了UseStartup方法, 里面用泛型注入了 Startup 类, 那程序就会自动实例化这个类, 并且去执行它里面的ConfigureServices 和Configure 这两个方法.

随机推荐