วิธีอ่านค่า AppSettings จากไฟล์. json ใน ASP.NET Core


247

ฉันได้ตั้งค่าข้อมูล AppSettings ของฉันในไฟล์ appsettings / Config .json ดังนี้:

{
  "AppSettings": {
        "token": "1234"
    }
}

ฉันค้นหาทางออนไลน์เกี่ยวกับวิธีการอ่านค่า AppSettings จากไฟล์. json แต่ไม่สามารถใช้ประโยชน์อะไรได้

ฉันเหนื่อย:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

ฉันรู้ด้วย ASP.NET 4.0 คุณสามารถทำได้:

System.Configuration.ConfigurationManager.AppSettings["token"];

แต่ฉันจะทำสิ่งนี้ใน ASP.NET Core ได้อย่างไร




สิ่งนี้สามารถลดความซับซ้อนได้เพียงแค่ใช้การฉีดพึ่งพาของ IConfiguration (ใน. net core 2.0) ซึ่งอธิบายไว้ที่นี่coding-issues.com/2018/10/…
Ranadheer Reddy

@RanadheerReddy การฉีดการพึ่งพาทำงานให้กับคอนโทรลเลอร์ แต่จะเกิดอะไรขึ้นถ้ามีคนต้องการอ่านค่าใน Middleware?
Alexander Ryan Baggett

คำตอบ:


320

เรื่องนี้มีการบิดและเปลี่ยนไม่กี่ ฉันได้แก้ไขคำตอบนี้ให้ทันสมัยด้วยASP.NET Core 2.0 (จนถึง 26/02/2018)

ส่วนใหญ่นำมาจากเอกสารอย่างเป็นทางการ :

เพื่อทำงานกับการตั้งค่าในแอปพลิเคชัน ASP.NET ของคุณขอแนะนำให้คุณสร้างอินสแตนซ์ConfigurationในStartupคลาสของแอปพลิเคชันของคุณเท่านั้น จากนั้นใช้รูปแบบตัวเลือกเพื่อเข้าถึงการตั้งค่าส่วนบุคคล สมมติว่าเรามีappsettings.jsonไฟล์ที่มีลักษณะดังนี้:

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

และเรามีวัตถุ POCO ที่เป็นตัวแทนของการกำหนดค่า:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

ตอนนี้เราสร้างการกำหนดค่าในStartup.cs:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }
}

โปรดทราบว่าappsettings.jsonจะมีการลงทะเบียนโดยค่าเริ่มต้นใน. NET Core 2.0 นอกจากนี้เรายังสามารถลงทะเบียนappsettings.{Environment}.jsonไฟล์กำหนดค่าต่อสภาพแวดล้อมหากจำเป็น

ถ้าเราต้องการฉีดการกำหนดค่าของเราไปยังตัวควบคุมของเราเราจะต้องลงทะเบียนกับรันไทม์ เราทำเช่นนี้ผ่านStartup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

และเราฉีดแบบนี้:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

Startupชั้นเต็ม:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}

3
รุ่นทำงานในเหมืองไม่ได้"1.0.0-beta4" "1.0.0-alpha4"ขอบคุณมาก!
Oluwafemi

2
ฉันต้องผ่านการตั้งค่าไปยังเลเยอร์อื่นจากคลาสยูทิลิตี้ดังนั้นฉันต้องการบางสิ่งบางอย่างเช่นสตริงคงที่สาธารณะนี้ GetConnectionString () {ถ้า (string.IsNullOrEmpty (connectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json" "); การกำหนดค่า = builder.Build (); connectionString = Configuration.Get ("ข้อมูล: DefaultConnection: ConnectionString"); }} คืนการเชื่อมต่อ String; }
dnxit

2
ฉันได้รับArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
ปีเตอร์

5
หลังจากเพิ่ม nuget Microsoft.Extensions.Options.ConfigurationExtensionsมันทำงานได้ตามที่คาดไว้
ปีเตอร์

2
คำอธิบายที่ดีของตรรกะกระบวนการตั้งค่า แต่มันพลาดจุดสำคัญ: SetBasePath () และ AddJsonFile () เป็นวิธีการขยายซึ่งอยู่ลึกเข้าไปในกรอบในชุดประกอบที่แยกต่างหาก ดังนั้นในการเริ่มต้นเราต้องติดตั้ง Microsoft.Extensions.Configuration.FileExtensions และ Microsoft.Extensions.Configuration.Json เพิ่มเติมจาก Microsoft.Extensions.Configuration
Bozhidar Stoyneff

63

ก่อน: ชื่อชุดประกอบและเนมสเปซของ Microsoft.Framework.ConfigurationModel ได้เปลี่ยนเป็น Microsoft.Framework.Configuration ดังนั้นคุณควรใช้: เช่น

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

project.jsonเป็นการอ้างอิงใน ใช้ beta5 หรือ 6 หากคุณยังไม่ได้ติดตั้ง 7 Startup.csจากนั้นคุณสามารถทำอะไรเช่นนี้ใน

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

หากคุณต้องการดึงตัวแปรจาก config.json คุณสามารถทำได้ทันทีโดยใช้:

public void Configure(IApplicationBuilder app)
{
    // Add .Value to get the token string
    var token = Configuration.GetSection("AppSettings:token");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
    });
}

หรือคุณสามารถสร้างคลาสที่ชื่อว่า AppSettings ดังนี้

public class AppSettings
{
    public string token { get; set; }
}

และกำหนดค่าบริการเช่นนี้:

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

จากนั้นเข้าถึงผ่านเช่นคอนโทรลเลอร์เช่นนี้

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}

คุณกรุณาแบ่งปันการกำหนดค่า json สำหรับ "AppSettings" สำหรับการอ้างอิง
Ankit Mori

ฉันต้องการ appSettings.json ทั้งหมดในการกำหนดค่าในชั้นเรียนนี้ฉันได้ออกแบบคลาสตาม JSON และใช้Configuration.Get<AppSettings>()ในการ deserialize ไฟล์ทั้งหมดแทนส่วนที่เฉพาะเจาะจง
Nilay

52

สำหรับ. NET Core 2.0 สิ่งต่าง ๆ มีการเปลี่ยนแปลงเล็กน้อย ตัวสร้างเริ่มต้นใช้วัตถุการกำหนดค่าเป็นพารามิเตอร์ดังนั้นการใช้ConfigurationBuilderไม่จำเป็นต้องใช้ นี่คือของฉัน:

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

public IConfiguration Configuration { get; }

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

POCO ของฉันเป็นStorageOptionsวัตถุที่กล่าวถึงด้านบน:

namespace FictionalWebApp.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

และการกำหนดค่าเป็นส่วนย่อยของappsettings.jsonไฟล์ของฉันชื่อAzureStorageConfig:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "fictionalwebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

สิ่งเดียวที่ฉันจะเพิ่มคือว่าตั้งแต่สร้างมีการเปลี่ยนแปลงฉันไม่ได้ทดสอบว่าความต้องการพิเศษบางอย่างที่จะทำเพื่อให้โหลดเมื่อเทียบกับappsettings.<environmentname>.jsonappsettings.json


เพียงทราบว่าคุณยังคงต้องโยน. AddJsonFile ("yourfile.json") ไปยัง ConfigConfiguration IE คุณต้องบอกว่าไฟล์อยู่ที่ไหน ไม่เห็นว่าในคำตอบ
Eric

เอริคฉันจะทดสอบอีกครั้งฉันจำไม่ได้ว่าเพิ่มบรรทัดนั้น จำเป็นหรือไม่ถ้าชื่อไฟล์ json ไม่ใช่ชื่อเริ่มต้น
MDMoore313

สำหรับ MSDN นั้นไม่จำเป็นสำหรับ ASPNETCORE 2.0 แม้ว่ามันจะไม่ทำงานสำหรับฉันเช่นกัน docs.microsoft.com/en-us/dotnet/api/…
Sat Thiru

1
ฉันสามารถยืนยันได้ว่าฉันต้องสร้างวัตถุ ConfigurationBuilder () และโทร AddJSONFile () เพื่อโหลดไฟล์ appSettings.json ลงในพจนานุกรมการกำหนดค่า นี่คือ ASP.NET Core 2.0 นี่เป็นข้อบกพร่องหรือไม่ในขณะที่มันทำงานตรงกันข้ามกับที่ MSDN บอกไว้?
Sat Thiru

1
คุณสามารถยกตัวอย่างวิธีฉีด StorageOptions ลงในคอนโทรลเลอร์ของคุณได้หรือไม่? ถ้าฉันใช้วิธีกอดโดยใช้การฉีดพึ่งพาpublic HomeController(IOptions<StorageOptions> settings)ฉันจะได้รับข้อความแสดงข้อผิดพลาดนี้: โมเดลชนิดที่ซับซ้อนที่ผูกไว้ต้องไม่เป็นนามธรรมหรือประเภทค่าและต้องมีตัวสร้างพารามิเตอร์แบบไม่มีพารามิเตอร์
Jpsy

30

ด้วย. NET Core 2.2 และในวิธีที่ง่ายที่สุดที่เป็นไปได้ ...

public IActionResult Index([FromServices] IConfiguration config)
{
    var myValue = config.GetValue<string>("MyKey");
}

appsettings.jsonถูกโหลดโดยอัตโนมัติและพร้อมใช้งานผ่านคอนสตรัคเตอร์หรือแอ็คชั่นการฉีดและมีGetSectionวิธีการIConfigurationเช่นกัน ไม่มีความจำเป็นที่จะปรับเปลี่ยนใด ๆStartup.csหรือถ้าสิ่งที่คุณต้องการคือProgram.csappsettings.json


2
ได้ง่าย:var myValue = config["MyKey"]
jokab

... และคุณสามารถทำได้: config ["Storage: ConnectionString"] เพื่อรับอิลิเมนต์ภายใน json ฉันสามารถยืนยันได้ว่าเทคนิคนี้ใช้ได้กับ. net core 3 และทำงานกับการฉีดก่อสร้าง
Mário Meyrelles

29

หากคุณเพียงต้องการที่จะรับค่าของโทเค็นแล้วใช้

Configuration["AppSettings:token"]


4
เพื่อให้สามารถใช้งานได้คุณจะต้องเริ่มต้นอินสแตนซ์ IConfiguration ผ่าน ConfigurationBuilder ก่อน
ΕГИІИО

20

.NET Core 3.0

อาจไม่ใช่วิธีที่ดีที่สุดในการรับค่าจากappsettings.jsonแต่มันง่ายและใช้งานได้ในแอปพลิเคชันของฉัน !!

ไฟล์appsettings.json

{
    "ConnectionStrings": {
        "DefaultConnection":****;"
    }

    "AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

ควบคุม:

ด้านบน :

using Microsoft.Extensions.Configuration;

ในรหัสของคุณ:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];

ตรงไปตรงมาสวย ขอบคุณสำหรับสิ่งนี้คุณช่วยฉันออกไป!
Matt

AddJsonFile ไม่มีอยู่ใน ConfigurationBuilder
Essej

10

การทำงานต่อไปนี้สำหรับแอปพลิเคชันคอนโซล

  1. ติดตั้งแพ็คเกจ NuGet ต่อไปนี้ ( .csproj);

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
    </ItemGroup>
  2. สร้างappsettings.jsonที่ระดับราก คลิกขวาที่มันและ "คัดลอกไปยังไดเรกทอรีออก" เป็น " คัดลอกถ้าใหม่กว่า "

  3. ไฟล์การกำหนดค่าตัวอย่าง:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Program.cs

    configurationSection.KeyและconfigurationSection.Valueจะมีคุณสมบัติการกำหนดค่า

    static void Main(string[] args)
    {
        try
        {
    
            IConfigurationBuilder builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
            IConfigurationRoot configuration = builder.Build();
            // configurationSection.Key => FilePath
            // configurationSection.Value => C:\\temp\\logs\\output.txt
            IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

8

สำหรับ. NET Core 2.0 คุณสามารถ:

ประกาศคู่คีย์ / ค่าของคุณใน appsettings.json:

{
  "MyKey": "MyValue"
}

ฉีดบริการการกำหนดค่าใน startup.cs และรับค่าโดยใช้บริการ

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });

8

ฉันสงสัยว่านี่เป็นวิธีปฏิบัติที่ดี แต่ทำงานได้ในท้องถิ่น ฉันจะอัปเดตสิ่งนี้หากล้มเหลวเมื่อฉันเผยแพร่ / ปรับใช้ (ไปยังบริการเว็บ IIS)

ขั้นตอนที่ 1 - เพิ่มแอสเซมบลีนี้ไปด้านบนของคลาสของคุณ (ในกรณีของฉันคลาสตัวควบคุม):

using Microsoft.Extensions.Configuration;

ขั้นตอนที่ 2 - เพิ่มหรือสิ่งที่ชอบ:

var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json").Build();

ขั้นตอนที่ 3 - โทรหาค่าคีย์ของคุณโดยทำสิ่งนี้ (ส่งคืนสตริง):

config["NameOfYourKey"]

ฉันคิดว่านี่ควรจะดีถ้าappsettings.jsonอยู่ในสารบบ
Ju66ernaut

7

เพียงเพื่อเติมเต็มคำตอบ Yuval Itzchakov

คุณสามารถโหลดการตั้งค่าได้โดยไม่ต้องใช้ฟังก์ชั่นการสร้างคุณสามารถฉีดได้

public IConfiguration Configuration { get; set; }

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

6

นอกจากคำตอบที่มีอยู่ฉันอยากจะพูดถึงว่าบางครั้งมันอาจมีประโยชน์ วิธีการขยายสำหรับIConfigurationเพื่อประโยชน์ของความเรียบง่าย

ฉันเก็บ JWT config ไว้ใน appsettings.json ดังนั้นคลาสเมธอดส่วนขยายของฉันจะมีลักษณะดังนี้:

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

มันช่วยให้คุณประหยัดมากของบรรทัดและคุณเพิ่งเขียนโค้ดที่สะอาดและน้อยที่สุด:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

เป็นไปได้ที่จะลงทะเบียน IConfigurationอินสแตนซ์เป็นซิงเกิลตันและฉีดทุกที่ที่คุณต้องการ - ฉันใช้คอนเทนเนอร์ Autofac นี่คือวิธีที่คุณทำ:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

คุณสามารถทำเช่นเดียวกันกับการฉีด MS พึ่งพา:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

นี่คือกรณีการใช้งานเต็มรูปแบบสำหรับ ASP.NET Core!

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>

"ASP.NET Core" เวอร์ชันใด?
Steve Smith

5

พวกเขาแค่เปลี่ยนแปลงสิ่งต่าง ๆ - เพียงแค่อัพเดต Visual Studio และมีระเบิดโครงการทั้งหมดบนท้องถนนเพื่อการฟื้นฟูและวิธีการใหม่มีลักษณะดังนี้:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);

    if (env.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

ฉันหายไปสายนี้!

.SetBasePath(env.ContentRootPath)

1
เราจะรับค่า AppSettings ในโครงการทดสอบโดยใช้วิธีการเดียวกันได้อย่างไร
S.Siva

2
They just keep changing things. นี้. เกือบทุกคำตอบในหน้านี้จะใช้กับ. Net Core รุ่นที่ระบุเท่านั้น
Steve Smith

4

.NET Core 2.1.0

  1. สร้างไฟล์. json ในไดเรกทอรีราก
  2. ในรหัสของคุณ:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. ติดตั้งการพึ่งพาต่อไปนี้:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

4. จากนั้นสำคัญ: คลิกขวาที่ไฟล์ appsettings.json -> คลิกที่ Properties -> เลือก Copy หากใหม่กว่า: ป้อนคำอธิบายรูปภาพที่นี่

  1. ในที่สุดคุณสามารถทำได้:

    การตั้งค่า [ "key1"]

พิจารณาว่าไฟล์ปรับแต่งของฉันจะเป็นแบบนี้:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

2

คุณสามารถลองรหัสด้านล่าง มันใช้งานได้สำหรับฉัน

public class Settings
{
    private static IHttpContextAccessor _HttpContextAccessor;

    public Settings(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static IConfigurationBuilder Getbuilder()
    {
        var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json");
        return builder;
    }

    public static string GetAppSetting(string key)
    {
        //return Convert.ToString(ConfigurationManager.AppSettings[key]);
        var builder = Getbuilder();
        var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
        return GetAppStringData;
    }

    public static string GetConnectionString(string key="DefaultName")
    {
        var builder = Getbuilder();
        var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
        return ConnectionString;
    }
}

ที่นี่ฉันได้สร้างหนึ่งคลาสเพื่อรับสตริงการเชื่อมต่อและการตั้งค่าแอพ

ฉันไฟล์ Startup.cs คุณต้องลงทะเบียนคลาสดังนี้

public class Startup
{

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}

2

สำหรับ ASP.NET Core 3.1 คุณสามารถปฏิบัติตามเอกสารนี้:

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

เมื่อคุณสร้างโครงการ ASP.NET Core 3.1 ใหม่คุณจะมีบรรทัดการกำหนดค่าต่อไปนี้ในProgram.cs:

Host.CreateDefaultBuilder(args)

สิ่งนี้ทำให้สิ่งต่อไปนี้:

  1. ChainedConfigurationProvider: เพิ่ม IConfiguration ที่มีอยู่เป็นแหล่งที่มา ในกรณีการกำหนดค่าเริ่มต้นเพิ่มการกำหนดค่าโฮสต์และตั้งเป็นแหล่งแรกสำหรับการกำหนดค่าแอพ
  2. appsettings.json โดยใช้ผู้ให้บริการกำหนดค่า JSON
  3. appsettings.Environment.json โดยใช้ผู้ให้บริการการกำหนดค่า JSON ตัวอย่างเช่น appsettings.Production.json และ appsettings.Development.json
  4. ความลับของแอพเมื่อแอพทำงานในสภาพแวดล้อมการพัฒนา
  5. ตัวแปรสภาพแวดล้อมโดยใช้ผู้ให้บริการกำหนดค่าตัวแปรสภาพแวดล้อม
  6. อาร์กิวเมนต์บรรทัดคำสั่งโดยใช้ผู้ให้บริการกำหนดค่าบรรทัดคำสั่ง

ซึ่งหมายความว่าคุณสามารถฉีดIConfigurationและดึงค่าด้วยคีย์สตริงหรือแม้แต่ค่าซ้อน ชอบIConfiguration ["Parent:Child"];

ตัวอย่าง:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

@Ogglas ... ผู้โทรของ WeatherForecastController () สามารถรับคลาสที่ใช้การกำหนดค่า ICon ได้อย่างไร
Johnny Wu

1

นี่คือ "การโกง" หรือไม่? ฉันเพิ่งกำหนดค่าของฉันในระดับเริ่มต้นคงที่และจากนั้นฉันสามารถเข้าถึงได้จากที่อื่น:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public static IConfiguration Configuration { get; set; }

1

รับภายในคอนโทรลเลอร์เป็นวัตถุผ่านการโทรGet<YourType>():

public IActionResult Index([FromServices] IConfiguration config)
{
    BillModel model = config.GetSection("Yst.Requisites").Get<BillModel>();
    return View(model);
}

1

ก่อนอื่นคุณควรฉีด IConfiguration และจากการอ่านจากการตั้งค่าคุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้:

  1. รับข้อมูลส่วน

    var redisConfig = configuration.GetSection("RedisConfig");
  2. รับค่าภายในส่วน

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. รับค่าซ้อนภายในส่วน

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");

การฉีดใช้งานได้กับคอนโทรลเลอร์ แต่ถ้าฉันต้องการใช้มันใน Middleware เช่นนี้ล่ะ? EG ฉันใช้ Redis เป็นตัวกลางในการแคชการตอบสนอง http
อเล็กซานเดอร์ไรอันบาเก็ตต์

1

วิธี. NET Core 2.2

(ไม่ต้องสงสัยเลยว่า Microsoft จะเปลี่ยนเป็นสิ่งที่แตกต่างอย่างสิ้นเชิงในเวอร์ชั่น. NET ถัดไป)

1. appSettings.json

อาจมีลักษณะเช่นนี้ ที่นี่เราจะโหลด Setting1 และ Setting2

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2. AppSettings.cs

POCOระดับการระงับค่าตั้ง 1 และค่าตั้ง 2 เราจะโหลด appsettings.json ลงในออบเจ็กต์คลาสนี้ โครงสร้างของคลาส POCO ควรตรงกับไฟล์ JSON คุณสมบัติอาจซ้อนอยู่ในคุณสมบัติ / คลาสอื่นหากต้องการ

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 Startup.cs

โหลด appSettings.json เข้าสู่วัตถุ AppSettings ของคุณและเริ่มใช้งาน:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }

0

ด้วยการทำซ้ำล่าสุดของ netcoreapp 3.1 คุณสามารถทำได้โดยไม่ต้องพึ่งพาบุคคลที่สามใด ๆ

ฉันสร้างส่วนสำคัญสำหรับสิ่งนี้แต่คุณสามารถใช้คลาสนี้เพื่ออ่านไฟล์ JSON และส่งคืนคุณสมบัติแบบไดนามิก

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

ฉันทำสิ่งนี้เป็นพิเศษเพื่อให้สามารถใช้ appconfig.json ในแอปพลิเคชันคอนโซล dotnet ของฉัน ฉันแค่ใส่สิ่งนี้ลงในProgram.Mainฟังก์ชั่นของฉัน:

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

และสิ่งนี้จะส่งคืนdynamicวัตถุสำหรับคุณสมบัติ (A JsonElement ถ้าไม่ใช่ดั้งเดิม) appsettings.jsonไฟล์ของฉันมีลักษณะเช่นนี้:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.