Cách đọc giá trị AppSinstall từ tệp .json trong ASP.NET Core


246

Tôi đã thiết lập dữ liệu Cài đặt ứng dụng của mình trong tệp cài đặt ứng dụng / Cấu hình .json như thế này:

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

Tôi đã tìm kiếm trực tuyến về cách đọc các giá trị AppSinstall từ tệp .json, nhưng tôi không thể nhận được bất cứ điều gì hữu ích.

Tôi đã thử:

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

Tôi biết với ASP.NET 4.0 bạn có thể làm điều này:

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

Nhưng làm thế nào để tôi làm điều này trong ASP.NET Core?




điều này thậm chí có thể được đơn giản hóa chỉ bằng cách sử dụng phép tiêm IConfiguration (trong .net core 2.0). Điều này được giải thích ở đây mã hóa -issues.com / 2018/10 / Mạnh
Ranadheer Reddy

@RanadheerReddy, tiêm phụ thuộc hoạt động cho bộ điều khiển. Nhưng nếu ai đó cần đọc một giá trị trong Middleware thì sao?
Alexander Ryan Baggett

Câu trả lời:


319

Điều này đã có một vài xoắn và biến. Tôi đã sửa đổi câu trả lời này để cập nhật với ASP.NET Core 2.0 (kể từ ngày 26/02/2018).

Điều này chủ yếu được lấy từ các tài liệu chính thức :

Để làm việc với các cài đặt trong ứng dụng ASP.NET của bạn, bạn chỉ nên khởi tạo một Configurationtrong Startuplớp của ứng dụng . Sau đó, sử dụng mẫu Tùy chọn để truy cập các cài đặt riêng lẻ. Giả sử chúng ta có một appsettings.jsontệp trông như thế này:

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

}

Và chúng ta có một đối tượng POCO đại diện cho cấu hình:

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

Bây giờ chúng tôi xây dựng cấu hình trong 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();
    }
}

Lưu ý rằng appsettings.jsonsẽ được đăng ký theo mặc định trong .NET Core 2.0. Chúng tôi cũng có thể đăng ký mộtappsettings.{Environment}.json tệp cấu hình cho mỗi môi trường nếu cần.

Nếu chúng tôi muốn đưa cấu hình của mình vào bộ điều khiển, chúng tôi sẽ cần phải đăng ký nó với thời gian chạy. Chúng tôi làm như vậy thông qua 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"));
}

Và chúng tôi tiêm nó như thế này:

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);
}

Cả Startuplớp

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
phiên bản "1.0.0-beta4"hoạt động trên của tôi không "1.0.0-alpha4". Cảm ơn rất nhiều!
Oluwafemi

2
Tôi cần chuyển một thiết lập cho một lớp khác từ một lớp tiện ích vì vậy tôi cần một cái gì đó giống như chuỗi tĩnh công khai này GetConnectionString () {if (string.IsNullOrEmpty (ConnectionString)) {var builder = new ConfigurationBuilder () .AddJsonFile ("config.json "); Cấu hình = builder.Build (); ConnectionString = Configuration.Get ("Dữ liệu: DefaultConnection: ConnectionString"); }} return ConnectionString; }
dnxit

2
Tôi nhận đượcArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
Peter

5
Sau khi thêm nuget, Microsoft.Extensions.Options.ConfigurationExtensionsnó hoạt động như mong đợi.
Peter

2
Giải thích hay về logic quá trình cấu hình, nhưng nó bỏ lỡ một điểm chính: SetBasePath () và AddJsonFile () là các phương thức mở rộng, được đặt sâu trong khung trong các cụm riêng biệt. Vì vậy, để bắt đầu, người ta cần cài đặt Microsoft.Extensions.Configuration.FileExtensions và Microsoft.Extensions.Configuration.Json ngoài Microsoft.Extensions.Configuration.
Bozhidar Stoyneff

63

Trước hết: Tên lắp ráp và không gian tên của Microsoft.Framework.ConfigurationModel đã thay đổi thành Microsoft.Framework.Configuration. Vì vậy, bạn nên sử dụng: vd

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

như một sự phụ thuộc trong project.json. Sử dụng beta5 hoặc 6 nếu bạn chưa cài đặt 7. Sau đó, bạn có thể làm một cái gì đó như thế này trong 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();
}

Nếu sau đó bạn muốn truy xuất một biến từ config.json, bạn có thể lấy nó ngay bằng cách sử dụng:

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);
    });
}

hoặc bạn có thể tạo một lớp có tên là AppSinstall như thế này:

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

và cấu hình các dịch vụ như thế này:

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

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

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

và sau đó truy cập nó thông qua một bộ điều khiển như thế này:

public class HomeController : Controller
{
    private string _token;

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

bạn có thể vui lòng chia sẻ cấu hình json cho "Ứng dụng cài đặt" để tham khảo
Ankit Mori

Tôi cần toàn bộ cấu hình appSinstall.json trong lớp, vì điều này, tôi đã thiết kế lớp theo JSON và sử dụng Configuration.Get<AppSettings>()để giải tuần tự hóa toàn bộ tệp thay vì một phần cụ thể.
Nilay

52

Đối với .NET Core 2.0, mọi thứ đã thay đổi một chút. Hàm khởi tạo khởi động lấy một đối tượng Cấu hình làm tham số, vì vậy ConfigurationBuilderkhông cần sử dụng . Đây là của tôi:

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 của tôi là StorageOptionsđối tượng được đề cập ở trên cùng:

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() { }
    }
}

Và cấu hình thực sự là một phần phụ của appsettings.jsontệp của tôi , được đặt tên 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"
  }
}

Điều duy nhất tôi sẽ thêm là, vì hàm tạo đã thay đổi, tôi chưa kiểm tra xem có cần phải làm gì thêm để tải appsettings.<environmentname>.jsonkhông trái ngược với nó không appsettings.json.


Chỉ cần một lưu ý rằng bạn vẫn cần phải ném .AddJsonFile ("yourfile.json") sang ConfigConfiguration. IE, bạn cần cho nó biết nơi tập tin. Không thấy điều đó trong câu trả lời.
Eric

Eric tôi sẽ kiểm tra lại rằng, tôi không nhớ đã thêm dòng đó; Có thể chỉ cần thiết nếu tên của tệp json không phải là tên mặc định?
MDMoore313

Trên mỗi MSDN, nó không bắt buộc đối với ASPNETCORE 2.0, mặc dù nó cũng không hoạt động đối với tôi. docs.microsoft.com/en-us/dotnet/api/ Kẻ
Sat Thiru

1
Tôi có thể xác nhận rằng tôi phải xây dựng một đối tượng Cấu hình () và gọi AddJSONFile () để tải các tệp appSinstall.json vào từ điển cấu hình. Đây là ASP.NET Core 2.0. Đây có phải là một lỗi vì nó chạy ngược lại với những gì MSDN nói không?
Sat Thiru

1
Bạn có thể đưa ra một ví dụ về cách bạn đưa StorageOptions vào bộ điều khiển của mình không? Nếu tôi sử dụng phương pháp tiếp cận sử dụng phương thức tiêm phụ thuộc public HomeController(IOptions<StorageOptions> settings), tôi nhận được thông báo lỗi này: Các kiểu phức ràng buộc mô hình không được là kiểu trừu tượng hoặc giá trị và phải có hàm tạo không tham số.
Jpsy

30

Với .NET Core 2.2, và theo cách đơn giản nhất có thể ...

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

appsettings.jsonđược tự động tải và có sẵn thông qua trình xây dựng hoặc hành động tiêm, và cũng có một GetSectionphương pháp IConfiguration. Không cần phải thay đổi Startup.cshoặc Program.csnếu tất cả những gì bạn cần là appsettings.json.


2
thậm chí đơn giản hơn:var myValue = config["MyKey"]
jokab

... và bạn có thể làm: config ["Storage: ConnectionString"] để lấy các phần tử bên trong json. Tôi có thể xác nhận kỹ thuật này hoạt động trên .net core 3 và hoạt động trên tiêm xây dựng.
Mário Meyrelles

29

Nếu bạn chỉ muốn nhận giá trị của mã thông báo thì hãy sử dụng

Configuration["AppSettings:token"]


4
Để làm việc này, bạn cần phải có một phiên bản IConfiguration được khởi tạo thông qua Cấu hình trước.
Ε é И

20

.NET Core 3.0

Có lẽ đó không phải là cách tốt nhất để nhận được giá trị từ appsinstall.json , nhưng nó đơn giản và nó hoạt động trong ứng dụng của tôi !!

Tệp appsinstall.json

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

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

Điều khiển:

Trên đầu trang :

using Microsoft.Extensions.Configuration;

Trong mã của bạn:

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

Khá đơn giản. Cảm ơn bạn vì điều này, bạn đã giúp tôi ra ngoài!
Matt

AddJsonFile không tồn tại trên Trình cấu hình
Essej

10

Các hoạt động sau đây cho các ứng dụng giao diện điều khiển;

  1. Cài đặt các gói NuGet sau ( .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. Tạo appsettings.jsonở cấp độ gốc. Nhấp chuột phải vào nó và "Sao chép vào thư mục đầu ra" là " Sao chép nếu mới hơn ".

  3. Tệp cấu hình mẫu:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Chương trình.cs

    configurationSection.KeyconfigurationSection.Valuesẽ có thuộc tính cấu hình.

    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

Đối với .NET Core 2.0, bạn có thể chỉ cần:

Khai báo các cặp khóa / giá trị của bạn trong appsinstall.json:

{
  "MyKey": "MyValue"
}

Tiêm dịch vụ cấu hình trong startup.cs và nhận giá trị sử dụng dịch vụ

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

Tôi nghi ngờ đây là thực hành tốt nhưng nó hoạt động tại địa phương. Tôi sẽ cập nhật điều này nếu nó không thành công khi tôi xuất bản / triển khai (lên dịch vụ web IIS).

Bước 1 - Thêm cụm này vào đầu lớp của bạn (trong trường hợp của tôi, lớp trình điều khiển):

using Microsoft.Extensions.Configuration;

Bước 2 - Thêm cái này hoặc cái gì đó tương tự:

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

Bước 3 - Gọi giá trị của khóa của bạn bằng cách thực hiện điều này (trả về chuỗi):

config["NameOfYourKey"]

Tôi nghĩ rằng điều này sẽ ổn với điều kiện appsettings.jsonlà trong thư mục bên phải
Ju66ernaut

7

Chỉ để bổ sung cho câu trả lời Yuval Itzchakov.

Bạn có thể tải cấu hình mà không cần chức năng xây dựng, bạn chỉ có thể tiêm nó.

public IConfiguration Configuration { get; set; }

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

6

Ngoài các câu trả lời hiện có tôi muốn đề cập rằng đôi khi có thể hữu ích khi có các phương thức mở rộng choIConfiguration để đơn giản.

Tôi giữ cấu hình JWT trong appsinstall.json để lớp phương thức mở rộng của tôi trông như sau:

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;
    }
}

Nó giúp bạn tiết kiệm rất nhiều dòng và bạn chỉ cần viết mã sạch và tối thiểu:

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

Bạn cũng có thể đăng ký IConfigurationcá thể dưới dạng singleton và tiêm nó bất cứ nơi nào bạn cần - Tôi sử dụng Autofac container ở đây cách bạn thực hiện:

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

Bạn có thể làm tương tự với MS Dependency Injection:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

Đây là trường hợp sử dụng đầy đủ cho ASP.NET Core!

article.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" Phiên bản nào?
Steve Smith

5

Họ chỉ tiếp tục thay đổi mọi thứ - vừa cập nhật Visual Studio và có toàn bộ quả bom dự án, trên con đường phục hồi và cách thức mới trông như thế này:

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();
}

Tôi tiếp tục bỏ lỡ dòng này!

.SetBasePath(env.ContentRootPath)

1
Làm cách nào chúng tôi có thể nhận các giá trị AppSinstall trong Dự án thử nghiệm bằng cách sử dụng cùng một phương pháp?
S.Siva

2
They just keep changing things. Điều này. Hầu như mọi câu trả lời trên trang này chỉ áp dụng cho một phiên bản cụ thể của .Net Core.
Steve Smith

4

.NET Core 2.1.0

  1. Tạo tệp .json trên thư mục gốc
  2. Trên mã của bạn:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. Cài đặt các phụ thuộc sau:

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

4. Sau đó, QUAN TRỌNG: Nhấp chuột phải vào tệp appsinstall.json -> nhấp vào Thuộc tính -> chọn Sao chép nếu mới hơn: nhập mô tả hình ảnh ở đây

  1. Cuối cùng, bạn có thể làm:

    cấu hình ["key1"]

Xem xét rằng tập tin cấu hình của tôi sẽ trông như thế này:

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

2

Bạn có thể thử mã dưới đây. Đây là làm việc cho tôi.

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;
    }
}

Ở đây tôi đã tạo một lớp để nhận cài đặt ứng dụng và chuỗi kết nối.

Tôi tập tin Startup.cs bạn cần đăng ký lớp như dưới đây.

public class Startup
{

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

2

Đối với ASP.NET Core 3.1, bạn có thể làm theo tài liệu này:

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

Khi bạn tạo một dự án ASP.NET Core 3.1 mới, bạn sẽ có dòng cấu hình sau Program.cs:

Host.CreateDefaultBuilder(args)

Điều này cho phép như sau:

  1. ChainedConfigurationProvider: Thêm một IConfiguration hiện có làm nguồn. Trong trường hợp cấu hình mặc định, thêm cấu hình máy chủ và đặt nó làm nguồn đầu tiên cho cấu hình ứng dụng.
  2. appsinstall.json bằng cách sử dụng nhà cung cấp cấu hình JSON.
  3. apps settings.Envir.json bằng cách sử dụng nhà cung cấp cấu hình JSON. Ví dụ: appsinstall. Producttion.json và appsinstall.Development.json.
  4. Ứng dụng bí mật khi ứng dụng chạy trong môi trường Phát triển.
  5. Biến môi trường sử dụng nhà cung cấp cấu hình Biến môi trường.
  6. Đối số dòng lệnh sử dụng nhà cung cấp cấu hình dòng lệnh.

Điều này có nghĩa là bạn có thể tiêm IConfigurationvà tìm nạp các giá trị bằng khóa chuỗi, thậm chí các giá trị lồng nhau. GiốngIConfiguration ["Parent:Child"];

Thí dụ:

appsinstall.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 ... làm thế nào người gọi của WeatherForecastControll () có thể có được lớp thực hiện IConfiguration?
Johnny Wu

1

Đây có phải là "gian lận"? Tôi vừa làm cho Cấu hình của mình trong lớp Khởi động tĩnh, và sau đó tôi có thể truy cập nó từ bất kỳ nơi nào khác:

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

Lấy nó bên trong bộ điều khiển như một đối tượng thông qua cuộc gọi Get<YourType>():

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

1

Trước tiên, bạn nên tiêm IConfiguration và sau đó để đọc từ cài đặt ứng dụng, bạn có thể sử dụng một trong các phương pháp sau:

  1. Lấy dữ liệu phần

    var redisConfig = configuration.GetSection("RedisConfig");
  2. Nhận một giá trị trong một phần

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. Nhận giá trị lồng nhau trong phần

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

Tiêm làm việc cho các bộ điều khiển, nhưng nếu tôi muốn sử dụng nó trong Middleware như ở đây thì sao? EG Tôi đang sử dụng Redis làm phần mềm trung gian để lưu trữ các phản hồi http.
Alexander Ryan Baggett

1

Cách .NET Core 2.2

(Không còn nghi ngờ gì nữa, Microsoft sẽ thay đổi nó một lần nữa thành một thứ hoàn toàn khác trong phiên bản .NET tiếp theo.)

1. appSinstall.json

Nó có thể trông giống như thế này. Ở đây chúng tôi sẽ tải Cài đặt 1 và Cài đặt2

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

2. AppSinstall.cs

Lớp POCO để giữ Cài đặt1 và Cài đặt2. Chúng tôi sẽ tải appsinstall.json vào đối tượng lớp này. Cấu trúc của lớp POCO phải khớp với tệp JSON, các thuộc tính có thể được lồng trong các thuộc tính / lớp khác nếu muốn.

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

3 Startup.cs

Tải appSinstall.json vào đối tượng AppSinstall của bạn và bắt đầu sử dụng nó:

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

Với phiên bản mới nhất của netcor Ứng dụng 3.1, bạn có thể thực hiện việc này khá đơn giản mà không cần bất kỳ sự phụ thuộc nào của bên thứ ba.

Tôi đã tạo một ý chính cho việc này , nhưng bạn có thể sử dụng lớp này để đọc tệp JSON và trả về các thuộc tính động.

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;
    }
}

Tôi đặc biệt thực hiện điều này để tôi có thể sử dụng appconfig.json trong ứng dụng bảng điều khiển dotnet của mình. Tôi chỉ đặt cái này trong Program.Mainchức năng của mình :

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

Và điều này sẽ trả lại một dynamicđối tượng cho tài sản. (Một JsonEuity nếu nó không phải là nguyên thủy). appsettings.jsonTập tin của tôi trông như thế này:

{
  "Environment": {
    "Token": "abc-123",
    "Name": "Production"
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.