[ASP.net Core] 两种方式读取应用程序配置文件 appsettings.json

Reading config in ASP.net Core

前言

刚开始接触ASP.net Core会遇到困惑的其中一点:没有Web.config组态档,以前的connectionStrings、appSettings不知道该如何设定及读取

本文简单介绍一下

实践

※本文范例版本为ASP.net Core 2.1

ASP.net Core的应用程序组态档改为appsettings.json,内容为json格式

从项目右键→加入→新增项目

搜寻关键字“应用程序”就可以找得到,把它加入至项目根路径即可

名称就维持appsettings.json最好别改它,因为跟Program.cs档里的WebHost.CreateDefaultBuilder()有关

然后在appsettings.json里写了如下数据

※留意ASP.net Core 2.1、Visual Studio 2017 15.8.3ver,默认加入的appsettings.json档不是UTF-8编码格式,所以不支持中文,想要支持中文有解套办法(或继续等微软改版XD),请继续看文章下方

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\MSSQLLocalDB;Database=_CHANGE_ME;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Email": "[email protected]",
  "ThemeColor": "red",
  "isRunSSL": true,
  "MaxNumber": 10
}

如果有使用Entity Framework Core要读取数据库连线字符串的话,请参考我的另一篇文章↓

[ASP.net Core 2] 使用Entity Framework Core 2 Database First方式存取数据(数据模型分隔在ClassLibrary项目)

而组态档读取方式,主要分两种

1.类似以前WebConfigurationManager,给Key回传Value的读取方式(使用IConfiguration界面)

请看Sample Code的Controller↓

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; 
using Microsoft.Extensions.Options;
using StarterM.Models;
/*引用命名空间*/
using Microsoft.Extensions.Configuration;

namespace StarterM.Controllers
{
    public class HomeController : Controller
    {
        
        private readonly IConfiguration _config;//这很像ASP.net的WebConfigurationManager
        //在构造函数使用相依性注入建立IConfiguration
        public HomeController(IConfiguration config)
        {
            this._config = config; 
        }

        public IActionResult Index()
        {
            ViewBag.config = this._config;
            return View();
        }
    }
}

View↓

 
@using Microsoft.Extensions.Configuration  
 
@{
    Layout = null;
} 
 


     

 
    @{
        IConfiguration config = (IConfiguration)ViewBag.config; 
    
  
  
  • DefaultConnection: @config.GetConnectionString("DefaultConnection")
  • Email: @(config.GetValue ("Email"))
  • ThemeColor: @(config.GetValue ("ThemeColor"))
  • isRunSSL: @(config.GetValue ("isRunSSL"))
  • MaxNumber: @(config.GetValue ("MaxNumber"))
}

执行结果↓

2.强类型读取方式

依照JSON内容先自行建立一个类,如果不知道怎么建立的话,就到json2csharp网站把appsettings.json里的JSON内容贴上去

以下是我新增的类档↓

接着要把appsettings.json里的数据倒进刚刚声明的类里,在Startup.cs↓

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using StarterM.Models;

namespace StarterM
{
    public class Startup
    {
        /// 
        /// 读取 appsettings.json 专用 
        /// 
        public IConfiguration _config { get; }
        public Startup(IConfiguration config)
        {
            this._config = config;
        } 
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc(); 
            //加这行
            services.Configure
  
  
   
   (this._config); 
        } 
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
             
            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();

        }
    }
}

  
  

Controller↓

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
/*引用命名空间*/
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;//加这行
using StarterM.Models;

namespace StarterM.Controllers
{
    public class HomeController : Controller
    {

        private readonly IOptions
  
  
   
    _opt; //加这行
        private readonly IConfiguration _config;
        //使用相依性注入
        public HomeController(IOptions
   
   
    
     opt, IConfiguration config)
        {
            this._config = config;
            this._opt = opt;//加这行
        }

        public IActionResult Index()
        {
            ViewBag.config = this._config;
            MyAppConfig objConfig = this._opt.Value;//注意这行
            ViewBag.ObjConfig = objConfig;
            return View();
        }
    }
}
   
   
  
  

View↓

@using StarterM.Models

  
  
@using Microsoft.Extensions.Configuration
@{
    Layout = null;
}



    



    
  
  
↓使用强类型对象读取应用程序配置文件案
@{ MyAppConfig objConfig = (MyAppConfig)ViewBag.ObjConfig;
  • DefaultConnection: @objConfig.ConnectionStrings.DefaultConnection
  • Email: @objConfig.Email
  • ThemeColor: @objConfig.ThemeColor
  • isRunSSL: @objConfig.isRunSSL
  • MaxNumber: @objConfig.MaxNumber
}
↓使用IConfiguration读取应用程序配置文件案
@{ IConfiguration config = (IConfiguration)ViewBag.config;
  • DefaultConnection: @config.GetConnectionString("DefaultConnection")
  • Email: @(config.GetValue ("Email"))
  • ThemeColor: @(config.GetValue ("ThemeColor"))
  • isRunSSL: @(config.GetValue ("isRunSSL"))
  • MaxNumber: @(config.GetValue ("MaxNumber"))
}

执行结果↓

刚才有提过,默认appsettings.json由于不是UTF-8编码,所以如果有下面的中文内容

执行结果就会变成乱码↓

解决办法:先用记事本notepad开启appsettings.json档,然后变更使用UTF-8编码后再覆盖存档。

重新建置项目后再执行一次网页,中文就可以正常显示了~

最后留意一下,如果采用强类型对象读取appsettings.json方式,由于组态数据注入对象时间点的关系

网站发布到IIS后如果有修改appsettings.json的话,记得IIS站台要重新启动才会生效

※使用IConfiguration读取appsettings.json的话,则无需此动作

※2019.4.8追记:.Net Core Console貌似无法从项目直接加入appsettings.json,那就手动自己加入吧XD

请参考:[.Net Core] 在.Net Core Console中读取应用程序组态档 appsettings.json

自行从Nuget把 Microsoft.Extensions.Configuration.Json 加入参考后,照着程序写,就可以读取appsettings.json

原文:大专栏  [ASP.net Core] 两种方式读取应用程序配置文件 appsettings.json


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11505334.html