c# - ASP.NetCore 2.2 读取 appsettings.json
问题描述
ASP.NetCore 2.2、VisualStudio 2019
我想弄清楚如何将web.config
文件转换为appsettings.json
,但我错过了一些东西。
我有一个startup.cs
看起来像的文件(为简洁而编辑):
using System;
using MyCoolApp.Models.Commodities;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Rewrite;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace MyCoolApp {
public class Startup {
public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
private IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services) {
services.AddDistributedMemoryCache();
services.Configure<IISServerOptions>(
options => {
options.AutomaticAuthentication = false;
}
);
services.AddMvc().SetCompatibilityVersion(
CompatibilityVersion.Version_2_2
);
var foo = Configuration.GetConnectionString("CommoditiesContext");
services.AddDbContext<CommoditiesContext>(
options => options.UseSqlServer(
Configuration.GetConnectionString("CommoditiesContext")
)
);
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
...
}
}
}
注意var foo = Configuration.GetConnectionString(...)
线。
我有一个web.config
看起来像(经过大量编辑)的文件:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<connectionStrings>
<add name="CommoditiesContext" connectionString="Server=mydb.company.com;Initial Catalog=Things;Integrated Security=True;providerName=System.Data.SqlClient;" />
</connectionStrings>
</configuration>
我已经把它变成了“顶级”appsettings.json
文件:
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"connectionStrings": {
"CommoditiesContext": "Server=mydb.company.com;Initial Catalog=Things;Integrated Security=True;providerName=System.Data.SqlClient;"
}
}
我有一个appsettings.Development.json
看起来像这样的文件:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"location": {
"path": ".",
"inheritInChildApplications": "false",
"system.webServer": {
"handlers": [],
"aspNetCore": {
"processPath": "%LAUNCHER_PATH%",
"arguments": "%LAUNCHER_ARGS%",
"stdoutLogEnabled": "true",
"stdoutLogFile": ".\\logs\\stdout",
"hostingModel": "InProcess",
"environmentVariables": [
{
"name": "ASPNETCORE_HTTPS_PORT",
"value": "44375"
},
{
"name": "ASPNETCORE_ENVIRONMENT",
"value": "Development"
},
{
"name": "COMPLUS_ForceENC",
"value": "1"
}
],
"handlerSettings": [
{
"name": "debugFile",
"value": "aspnetcore-debug.log"
},
{
"name": "debugLevel",
"value": "FILE,TRACE"
}
]
},
"modules": [],
"isapiFilters": []
}
}
}
我也有一个“生产”,但暂时让我们限制噪音。
我现在的问题是,当我在本地调试它时,我可以services.AddDbContext
在线上设置一个 bp startup.cs
,然后查看foo
. 它是null
。我要么错误地构建了appsettings.json
文件,要么错误地读取了配置信息,但我不知道是哪个。
我错过了什么?
编辑
program.cs
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
namespace CalendarReservations {
public class Program {
public static void Main(string[] args) {
CreateWebHostBuilder(args).Build().Run();
}
private static IWebHostBuilder CreateWebHostBuilder(string[] args) {
return WebHost.CreateDefaultBuilder(args)
.UseIIS()
.UseStartup<Startup>();
}
}
}
解决方案
问题是您在启动构造函数中为配置设置了错误的基本路径。AppDomain.CurrentDomain.BaseDirectory
会给你错误的位置,因此不会加载任何配置文件。相反,请考虑System.IO.Directory.GetCurrentDirectory()
改用。
推荐阅读
- arrays - Matlab:从 LxMxN 数组中提取 LxN 数组
- rust - 我可以在 Rust 中定义一个带有自身类型参数的特征吗?
- keras - ValueError:找到两个具有相同名称的指标:recall
- reactjs - AWS Amplify Deploy(构建和测试)React JS + Jest + Enzyme
- php - Laravel 显示帖子日期和其他
- html - PDF 链接转到“无法获取文件”并出现 404 错误
- linux - 使用 awk 从日志中解析数据
- grpc - GRPC 中间件库是否支持 grpc-node?
- android - 如何避免一次创建多个heremapslite实例?
- angular - 如何在exhaustMap(或任何地图)运算符之后将参数传递给点击?