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