Cấu hình Trình quản lý. Cài đặt có sẵn trong .NET Core 2.0 không?


142

Tôi đã có một phương pháp đọc các cài đặt từ tệp cấu hình của mình như thế này:

var value = ConfigurationManager.AppSettings[key];

Nó biên dịch tốt khi chỉ nhắm mục tiêu .NET Standard 2.0.

Bây giờ tôi cần nhiều mục tiêu, vì vậy tôi đã cập nhật tệp dự án của mình với:

<TargetFrameworks>netcoreapp2.0;net461;netstandard2.0</TargetFrameworks>

Nhưng bây giờ, quá trình biên dịch thất bại netcoreapp2.0với thông báo lỗi sau:

Error   CS0103  The name 'ConfigurationManager' does not exist in the current context   (netcoreapp2.0)

Một cách riêng biệt, tôi đã tạo một ứng dụng bảng điều khiển .NET Core 2.0 mới (chỉ nhắm mục tiêu .NET Core 2.0 lần này), nhưng tương tự như vậy dường như không có ConfigurationManagertrong không gian tên System.Configuration.

Tôi khá bối rối vì nó có sẵn trong .NET Standard 2.0, vì vậy tôi hy vọng nó sẽ có sẵn trong .NET Core 2.0, vì .NET Core 2.0 tuân thủ .NET Standard 2.0.

Tôi đang thiếu gì?


10
Bạn có thể thiếu điều này . (Lưu ý rằng một mục tiêu .NET Standard bao gồm cả .NET và .NET Core, vì vậy thực sự không cần phải xây dựng các mục tiêu đó một cách riêng biệt.)
Jeroen Mostert

Cảm ơn @JeroenMostert, thêm gói NuGet System.Configuration.ConfigurationManager đã giải quyết vấn đề. Bây giờ, đây có lẽ là một câu hỏi riêng biệt nhưng làm thế nào .NET Core 2.0 được coi là tuân thủ .NET Standard 2.0 nếu người ta cần thêm các gói để polyfill các bit bị thiếu?
Alex Sanséau

2
"Tuân thủ .NET Standard 2.0" có nghĩa là "nếu bạn xây dựng mục tiêu này để nhắm mục tiêu .NET Standard 2.0, nó sẽ chạy trên .NET Core 2.0 (trong số các nền tảng khác)". Điều đó không có nghĩa là "nếu bạn xây dựng điều này để nhắm mục tiêu .NET Core 2.0, tất cả các API .NET Standard 2.0 sẽ có sẵn mà không cần phải thực hiện thêm". Nếu bạn xây dựng bản này thành .NET Standard 2.0 và nó sẽ không chạy trên .NET Core, thì bạn có thể khiếu nại, nhưng tôi nghĩ rằng nó chỉ hoạt động. (Tuy nhiên, tôi chưa thử nó.)
Jeroen Mostert

4
@ AlexSanséau Các gói NuGet không phải là đa năng. Khi bắt đầu làm việc trên .NET Core, Microsoft đã quyết định chọn tham gia API, nghĩa là các ứng dụng của bạn có dung lượng nhỏ hơn. Tôi khuyên bạn nên dành chút thời gian và xem các video mà Immo Landwerth đã tạo trên .NET Standard ( youtube.com/, ) - anh ấy là Thủ tướng trong nhóm .NET Standard
Jamie Taylor

1
RE: It compiles fine when targeting .NET Standard 2.0 only- điều này không thể chính xác, vì ConfigurationManagerkhông phải là một phần của .NET Standard (cho đến nay điều này đúng cho đến v.2.1).
G. Stoynev

Câu trả lời:


268

Có, ConfigurationManager.AppSettingscó sẵn trong .NET Core 2.0 sau khi tham khảo gói NuGet System.Configuration.ConfigurationManager.

Tín dụng đến @JeroenMostert vì đã cho tôi giải pháp.


1
Bạn có thể gửi mã từ tập tin cấu hình của bạn? Tôi đang cố gắng tìm ra cách / nơi tôi đặt biến toàn cục trong .NET Core 2.0
egmfrs

1
@egmfrs, bạn có phiền khi nhắc lại cụm từ không? Các biến toàn cục sẽ tồn tại dưới dạng các thuộc tính tĩnh của một lớp. Các tệp cấu hình chứa các cài đặt ứng dụng là định dạng thông thường của chúng:<add key="YourSetting" value="YourValue" />
Alex Sanséau

2
@ AlexSanséau, tôi đang cố gắng tìm ra nơi tôi có thể đặt các giá trị cho Cài đặt ứng dụng. web.config hoặc appsinstall.json không hoạt động. Bạn có thể đưa ra một ví dụ về nơi đặt AppSinstall không? Cảm ơn.
Jan Đứcl

2
@JanDeutschl, nó sẽ đi vào phần appSinstall của web.config hoặc app.config, như bạn sẽ làm cho một dự án .NET truyền thống.
Alex Sanséau

8
Tôi hơi bối rối. Điều này không liệt kê .NET Framework 4.6như là một phụ thuộc. Điều đó có nghĩa là dự án .NET Core` của tôi không còn là một Coredự án thuần túy nữa?
James Poulose

20

Tôi đã cài đặt System.Configuration.ConfigurationManagertừ Nuget vào ứng dụng .net core 2.2 của mình.

Sau đó tôi tham khảo using System.Configuration;

Tiếp theo, tôi đã thay đổi

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

Cho đến nay tôi tin rằng điều này là chính xác. 4.5.0 is typical with .net core 2.2

Tôi không có bất kỳ vấn đề với điều này.


Một trong những sửa chữa dễ dàng để làm cho di chuyển. Một số người khác không vui lắm: /
Tom Stickel

bạn cũng đã tạo một tệp web.config?
Thụy Điển_junior_dev

2
nó không hoạt động với tôi (.net core 3.1). nó không có bất kỳ dữ liệu cài đặt nào nếu truy cập
arteny

@Arteny - Tôi chưa bao giờ thử nghiệm nó với 3.1 - Tôi đã cài đặt 3.1 và chơi với nó ở nhà - nhưng khách hàng hiện tại của tôi không muốn nâng cấp bất cứ lúc nào sớm.
Tom Stickel

9

Khi bạn đã thiết lập các gói, bạn sẽ cần tạo một app.config hoặc web.config và thêm một số thứ như sau:

<configuration>
  <appSettings>
    <add key="key" value="value"/>
  </appSettings>
</configuration>

7

Tập mới nhất của hướng dẫn thực hiện như sau: (từ https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

Sử dụng:

System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);

Từ các tài liệu:

public static class EnvironmentVariablesExample
{
    [FunctionName("GetEnvironmentVariables")]
    public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log)
    {
        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
        log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
    }

    public static string GetEnvironmentVariable(string name)
    {
        return name + ": " +
            System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
    }
}

Cài đặt ứng dụng có thể được đọc từ các biến môi trường cả khi phát triển cục bộ và khi chạy trong Azure. Khi phát triển cục bộ, cài đặt ứng dụng đến từ Valuesbộ sưu tập trong tệp local.sinstall.json . Trong cả hai môi trường, cục bộ và Azure, đều GetEnvironmentVariable("<app setting name>")lấy giá trị của cài đặt ứng dụng được đặt tên. Chẳng hạn, khi bạn đang chạy cục bộ, "Tên trang web của tôi" sẽ được trả về nếu tệp local.sinstall.json của bạn chứa { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }.

Các System.Configuration.ConfigurationManager.AppSettings tài sản là một API thay thế để nhận các giá trị thiết lập ứng dụng, nhưng chúng tôi khuyên bạn nên sử dụng GetEnvironmentVariablenhư trình bày ở đây.


Đối với bất kỳ ai đang thử điều này, bạn sẽ nhận được cú pháp tương tự như ví dụ của Microsoft bằng cách khai báo điều này:using static System.Environment;
MattMakes

1

Bạn có thể sử dụng Cấu hình để giải quyết vấn đề này.

Ví dụ (Startup.cs):

Bạn có thể chuyển DI đến bộ điều khiển sau khi thực hiện.

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

        Configuration = builder.Build();

    }

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

        var microserviceName = Configuration["microserviceName"];

       services.AddSingleton(Configuration);

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