在appsettings.json中阅读ASP.NetCore 2.2

时间:2019-09-05 15:31:16

标签: c# asp.net-core

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": []
        }
    }
}

我也有一个“ Production 1”,但让我们暂时限制噪音。

目前,我的问题是,当我在本地调试时,可以在services.AddDbContext的{​​{1}}行上设置一个bp,然后查看startup.cs的值。是foo。我或者null文件的结构不正确,或者读取的配置信息不正确,但是我不知道哪个。

我想念什么?

修改

appsettings.json

program.cs

2 个答案:

答案 0 :(得分:3)

问题是您在启动构造函数中为配置设置了错误的基本路径。 AppDomain.CurrentDomain.BaseDirectory将为您提供错误的位置,因此将不会加载配置文件。相反,请考虑改用System.IO.Directory.GetCurrentDirectory()

答案 1 :(得分:1)

从您的代码(startup.cs)中获取

var builder = new ConfigurationBuilder()
                .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                .AddJsonFile("appsettings.json", true, true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", true)
                .AddEnvironmentVariables();

            Configuration = builder.Build();

编辑:正如柯克在评论中所指出的

您需要这样替换

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

为什么?因为如果您在Program.cs类中有此

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)

那么您就不需要设置自己了

  

基于ASP.NET Core dotnet的默认配置Web应用程序new   模板在构建主机时调用CreateDefaultBuilder。   CreateDefaultBuilder在以下位置为应用提供默认配置:   以下顺序:

     

以下内容适用于使用Web Host的应用程序。有关的详细信息   使用通用主机时的默认配置,请参阅最新的   该主题的版本。

     

主机配置提供自:前缀为环境变量   使用ASPNETCORE_(例如ASPNETCORE_ENVIRONMENT)使用   环境变量配置提供程序。前缀(ASPNETCORE_)   加载配置键值对时会被剥离。   使用命令行配置提供程序的命令行参数。   使用以下文件从以下位置提供应用程序配置:appsettings.json   配置提供程序。 appsettings。{Environment} .json使用文件   配置提供程序。当应用程式在   使用入口程序集的开发环境。环境   使用环境变量配置提供程序的变量。   使用命令行配置提供程序的命令行参数。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2