ConfigurationManager.AppSettings มีอยู่ใน. NET Core 2.0 หรือไม่


143

ฉันมีวิธีที่อ่านการตั้งค่าจากไฟล์ปรับแต่งของฉันดังนี้:

var value = ConfigurationManager.AppSettings[key];

มันรวบรวมได้ดีเมื่อกำหนดเป้าหมาย. NET Standard 2.0 เท่านั้น

ตอนนี้ฉันต้องการเป้าหมายหลายเป้าหมายดังนั้นฉันจึงอัปเดตไฟล์โครงการด้วย:

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

แต่ตอนนี้การรวบรวมล้มเหลวnetcoreapp2.0ด้วยข้อความแสดงข้อผิดพลาดต่อไปนี้:

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

แยกกันฉันสร้าง .NET หลัก 2.0 คอนโซลแอพลิเคชันใหม่ (เฉพาะการกำหนดเป้าหมายหลัก .NET 2.0 ในครั้งนี้) แต่ในทำนองเดียวกันดูเหมือนว่าจะไม่ConfigurationManagerอยู่ภายใต้การ System.Configurationnamespace

ฉันค่อนข้างสับสนเพราะมันมีอยู่ภายใต้. NET Standard 2.0 ดังนั้นฉันคาดว่ามันจะพร้อมใช้งานใน. NET Core 2.0 เนื่องจาก. NET Core 2.0 นั้นสอดคล้องกับ. NET Standard 2.0

ฉันพลาดอะไรไป


11
คุณอาจหายไปนี้ (โปรดทราบว่าเป้าหมาย. NET Standard ครอบคลุมทั้ง . NET และ. NET Core ดังนั้นจึงไม่จำเป็นต้องสร้างแยกต่างหากเช่นกัน)
Jeroen Mostert

ขอบคุณ @JeroenMostert การเพิ่มแพ็คเกจ NuGet System.Configuration.ConfigurationManager แก้ไขปัญหาได้ ตอนนี้อาจเป็นคำถามที่แยกต่างหาก แต่เป็นอย่างไร. NET Core 2.0 ถือว่า. NET Standard 2.0 เป็นไปตามมาตรฐานหากต้องการเพิ่มแพคเกจเพื่อ polyfill บิตที่หายไป?
Alex Sanséau

2
". NET Standard 2.0 compliant" หมายถึง "ถ้าคุณสร้างสิ่งนี้เพื่อกำหนดเป้าหมาย. NET Standard 2.0 จะทำงานบน. NET Core 2.0 (ท่ามกลางแพลตฟอร์มอื่น ๆ )" ไม่ได้หมายความว่า "ถ้าคุณสร้างสิ่งนี้เพื่อกำหนดเป้าหมายเป็น. NET Core 2.0 API. .NET Standard 2.0 ทั้งหมดจะพร้อมใช้งานโดยไม่มีการดำเนินการเพิ่มเติม" ถ้าคุณสร้างนี้เพื่อ .NET มาตรฐาน 2.0 และมันจะไม่ทำงานใน .NET หลักแล้วคุณมีสาเหตุสำหรับการร้องเรียน แต่ผมคิดว่านี่เป็นเพียงการไปทำงาน (ฉันยังไม่ได้ทดสอบเลย)
Jeroen Mostert

4
@ AlexSanséauแพ็คเกจ NuGet ไม่ใช่โพลีแบบเติม เมื่อเริ่มทำงานกับ. NET Core Microsoft ตัดสินใจเลือกใช้ API หมายความว่าแอปพลิเคชันของคุณมีขนาดเล็กกว่า ฉันอยากจะแนะนำให้ใช้เวลาสักครู่และดูวิดีโอที่ Immo Landwerth ได้สร้างบน. NET Standard ( youtube.com/… ) - เขาเป็น PM ในทีม. NET Standard
Jamie Taylor

1
RE: It compiles fine when targeting .NET Standard 2.0 only- สิ่งนี้ไม่ถูกต้องเนื่องจากConfigurationManagerไม่ได้เป็นส่วนหนึ่งของ. NET Standard (จนถึงขณะนี้เป็นจริงถึง v.2.1)
G. Stoynev

คำตอบ:


268

ใช่ConfigurationManager.AppSettingsมีอยู่ในหลัก .NET 2.0 System.Configuration.ConfigurationManagerหลังจากที่อ้างอิงแพคเกจ

เครดิตไปที่ @JeroenMostert ที่ให้ทางออกแก่ฉัน


1
คุณสามารถโพสต์รหัสจากไฟล์ปรับแต่งของคุณได้หรือไม่? ฉันกำลังพยายามหาวิธี / ตำแหน่งที่ฉันตั้งค่าตัวแปรส่วนกลางใน. NET Core 2.0
egmfrs

1
@egmfrs คุณจะโปรดวลีอีกครั้งได้ไหม ตัวแปรโกลบอลจะมีอยู่ในรูปแบบของคุณสมบัติคงที่ของคลาส ไฟล์กำหนดค่าประกอบด้วยการตั้งค่าแอปพลิเคชันเป็นรูปแบบปกติ:<add key="YourSetting" value="YourValue" />
Alex Sanséau

2
@ AlexSanséauฉันพยายามหาว่าฉันสามารถตั้งค่าสำหรับ AppSettings ได้ที่ไหน web.config หรือ appsettings.json ไม่ทำงาน คุณยกตัวอย่างการตั้งค่า AppSettings ได้ไหม? ขอบคุณ
Jan Deutschl

2
@JanDeutschl มันควรจะเข้าไปในส่วน appSettings ของ web.config หรือ app.config ตามที่คุณต้องการสำหรับโครงการ. NET แบบดั้งเดิม
Alex Sanséau

8
ฉันสับสนเล็กน้อย รายการนี้.NET Framework 4.6เป็นการอ้างอิง นั่นหมายความว่าโครงการ '. NET Core` ของฉันไม่ได้เป็นCoreโครงการที่บริสุทธิ์อีกต่อไปแล้ว?
James Poulose

20

ฉันติดตั้งSystem.Configuration.ConfigurationManagerจาก Nuget เป็นแอปพลิเคชัน. net core 2.2 ของฉัน

ฉันอ้างอิงแล้ว using System.Configuration;

ต่อมาฉันเปลี่ยน

WebConfigurationManager.AppSettings

to ..

ConfigurationManager.AppSettings

จนถึงตอนนี้ฉันเชื่อว่ามันถูกต้อง 4.5.0 is typical with .net core 2.2

ฉันไม่ได้มีปัญหาใด ๆ กับเรื่องนี้


หนึ่งในวิธีการแก้ไขที่ทำได้ง่ายสำหรับการย้ายข้อมูล บางคนไม่สนุก: /
Tom Stickel

คุณสร้างไฟล์ web.config ด้วยหรือไม่
swedish_junior_dev

2
มันใช้งานไม่ได้สำหรับฉัน (.net core 3.1) ไม่มีข้อมูลการตั้งค่าใด ๆ หากเข้าถึง
arteny

@Arteny - ฉันไม่เคยทดสอบด้วย 3.1 - ฉันติดตั้ง 3.1 และเล่นกับมันที่บ้าน - แต่ลูกค้าปัจจุบันของฉันไม่ต้องการอัปเกรดทุกเวลาเร็ว ๆ นี้
Tom Stickel

9

เมื่อคุณมีการตั้งค่าแพ็คเกจคุณจะต้องสร้างแอปตั้งค่าหรือ web.config และเพิ่มสิ่งต่อไปนี้:

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

7

ชุดคำแนะนำล่าสุดมีดังนี้: (จากhttps://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-class-library#environment-variables )

ใช้:

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

จากเอกสาร:

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

การตั้งค่าแอพสามารถอ่านได้จากตัวแปรสภาพแวดล้อมทั้งเมื่อพัฒนาในเครื่องและเมื่อทำงานใน Azure เมื่อพัฒนาในเครื่องการตั้งค่าแอพมาจากการValuesรวบรวมในไฟล์local.settings.json ในทั้งสองระบบคือ local และ Azure เพื่อGetEnvironmentVariable("<app setting name>")ดึงค่าของการตั้งค่าแอพที่มีชื่อ ตัวอย่างเช่นเมื่อคุณกำลังทำงานในประเทศ "ชื่อเว็บไซต์ของฉัน" จะถูกส่งกลับถ้าไฟล์ local.settings.json { "Values": { "WEBSITE_SITE_NAME": "My Site Name" } }ของคุณมี

System.Configuration.ConfigurationManager.AppSettingsคุณสมบัติเป็น API ทางเลือกสำหรับการได้รับค่าการตั้งค่าแอป แต่เราขอแนะนำให้คุณใช้GetEnvironmentVariableเป็นที่แสดงที่นี่


สำหรับใครก็ตามที่ลองใช้สิ่งนี้คุณจะได้รับไวยากรณ์ที่คล้ายคลึงกับตัวอย่างของ Microsoft โดยประกาศสิ่งนี้:using static System.Environment;
MattMakes

1

คุณสามารถใช้การกำหนดค่าเพื่อแก้ไขปัญหานี้

เช่น (Startup.cs):

คุณสามารถส่ง DI ไปยังคอนโทรลเลอร์ได้หลังจากการติดตั้งนี้

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

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