MVC 5(.NET Framework 4.6.1)读取appsettings.json配置的问题咨询
在.NET Framework 4.6.1 MVC5项目中从appsettings.json加载POCO对象
不用纠结Owin的Startup.cs里的Configuration方法是void类型——咱们完全可以用微软的现代配置系统来实现需求,而且不需要依赖Owin(除非你本来就需要Owin的其他功能)。下面是一步步的具体方案:
1. 安装必要的NuGet包
首先得把读取JSON配置和绑定POCO的依赖包装上,打开NuGet包管理器控制台,运行这些命令:
Install-Package Microsoft.Extensions.Configuration Install-Package Microsoft.Extensions.Configuration.Json Install-Package Microsoft.Extensions.Configuration.Binder
2. 创建并配置appsettings.json文件
在项目根目录新建appsettings.json文件,写入你的配置内容,比如:
{ "DatabaseSettings": { "ConnectionString": "Server=.;Database=YourDb;Trusted_Connection=True;", "MaxRetryCount": 3 }, "ApiSettings": { "BaseUrl": "https://your-api.com", "Timeout": 20 } }
然后右键这个文件→属性,把“复制到输出目录”设置为「如果较新则复制」或者「始终复制」——否则运行时程序找不到这个文件。
3. 定义对应的POCO类
根据你的JSON结构创建匹配的实体类,比如:
public class AppSettings { public DatabaseSettings DatabaseSettings { get; set; } public ApiSettings ApiSettings { get; set; } } public class DatabaseSettings { public string ConnectionString { get; set; } public int MaxRetryCount { get; set; } } public class ApiSettings { public string BaseUrl { get; set; } public int Timeout { get; set; } }
4. 在Global.asax中初始化配置并绑定POCO
因为你的项目入口是Global.asax,直接在Application_Start方法里完成配置加载:
using Microsoft.Extensions.Configuration; using System.IO; public class MvcApplication : System.Web.HttpApplication { // 可以定义静态属性来全局访问配置 public static AppSettings GlobalAppSettings { get; private set; } protected void Application_Start() { // 构建配置对象 var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot config = configBuilder.Build(); // 绑定到POCO对象 GlobalAppSettings = new AppSettings(); config.Bind(GlobalAppSettings); // 剩下的MVC初始化代码保持不变 AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } }
5. 在项目中使用配置
现在你可以在控制器、服务类里直接访问全局配置了:
public class HomeController : Controller { public ActionResult Index() { string apiUrl = MvcApplication.GlobalAppSettings.ApiSettings.BaseUrl; ViewBag.ApiBaseUrl = apiUrl; return View(); } }
如果你已经在用Owin的Startup.cs
如果你的项目已经引入了Owin,也可以把配置初始化放到Startup的Configuration方法里,比如:
public void Configuration(IAppBuilder app) { var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot config = configBuilder.Build(); var appSettings = new AppSettings(); config.Bind(appSettings); // 可以把配置存入Owin上下文,或者注册到DI容器(比如Autofac、Unity) app.Properties["AppSettings"] = appSettings; }
关键注意点
- 不要把配置存到静态类里(除非你真的没办法),最好用依赖注入容器注册为单例,这样更利于测试和解耦。
reloadOnChange: true可以让程序在你修改appsettings.json后自动重新加载配置,不需要重启应用。
内容的提问来源于stack exchange,提问作者TheRoadrunner
相关产品推荐
相关产品推荐

