Instellingen lezen van app.config of web.config in .NET

Ik werk aan een C#-klassenbibliotheek die instellingen uit het bestand web.configof app.configmoet kunnen lezen (afhankelijk van of de DLL waarnaar wordt verwezen vanuit een ASP.NET-webtoepassing of een Windows Forms-toepassing).

Ik heb dat gevonden

ConfigurationSettings.AppSettings.Get("MySetting")

werkt, maar die code is door Microsoft gemarkeerd als verouderd.

Ik heb gelezen dat ik zou moeten gebruiken:

ConfigurationManager.AppSettings["MySetting"]

De klasse System.Configuration.ConfigurationManagerlijkt echter niet beschikbaar te zijn vanuit een C# Class Library-project.

Wat is de beste manier om dit te doen?


Antwoord 1, autoriteit 100%

Je moet een referentie toevoegenaan System.Configurationin de referentiesmapvan je project.

U zou zeker de ConfigurationManagermoeten gebruiken in plaats van de verouderde ConfigurationSettings.


Antwoord 2, autoriteit 98%

Voor een voorbeeld app.config-bestand zoals hieronder:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="countoffiles" value="7" />
    <add key="logfilelocation" value="abc.txt" />
  </appSettings>
</configuration>

U leest de bovenstaande applicatie-instellingen met behulp van de onderstaande code:

using System.Configuration;

Mogelijk moet u ook een verwijzing naar System.Configurationin uw project toevoegen als die er nog niet is. U kunt dan als volgt toegang krijgen tot de waarden:

string configvalue1 = ConfigurationManager.AppSettings["countoffiles"];
string configvalue2 = ConfigurationManager.AppSettings["logfilelocation"];

Antwoord 3, autoriteit 11%

Update voor .NET Framework 4.5 en 4.6; het volgende werkt niet meer:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Ga nu naar de klasse Setting via Eigenschappen:

string keyvalue = Properties.Settings.Default.keyname;

Zie Applicatie-instellingen beherenvoor meer informatie.


Antwoord 4, autoriteit 5%

Klik met de rechtermuisknop op je klasbibliotheek en kies de optie ‘Verwijzingen toevoegen’ in het menu.

En selecteer op het .NET-tabblad System.Configuration. Dit omvat het System.Configuration DLL-bestand in uw project.


Antwoord 5, autoriteit 4%

Ik gebruik dit en het werkt goed voor mij:

textBox1.Text = ConfigurationManager.AppSettings["Name"];

Antwoord 6, autoriteit 3%

Lees vanuit configuratie:

Je moet een verwijzing naar de configuratie toevoegen:

  1. Open “Eigenschappen” in uw project
  2. Ga naar het tabblad “Instellingen”
  3. Voeg “Naam” en “Waarde” toe
  4. Krijg waarde met de volgende code:

    string value = Properties.Settings.Default.keyname;
    

Opslaan in de configuratie:

  Properties.Settings.Default.keyName = value;
   Properties.Settings.Default.Save();

Antwoord 7, Autoriteit 2%

U moet een verwijzing toevoegen aan het systeem. Configuratie-assemblage aan het project.


Antwoord 8, Autoriteit 2%

U kunt het bestand App.config aan een DLL-bestand toevoegen. App.config werkt alleen voor uitvoerbare projecten, omdat alle DLL-bestanden de configuratie van het configuratiebestand voor het EXE-bestand worden uitgevoerd.

Laten we zeggen dat je twee projecten in je oplossing hebt:

  • somedll
  • somExe

Uw probleem kan gerelateerd zijn aan het feit dat u het app.config-bestand op een dag en niet someexe opneemt. Somedyl kan de configuratie van het Someexe-project lezen.


Antwoord 9

Probeer dit:

string keyvalue = System.Configuration.ConfigurationManager.AppSettings["keyname"];

In de Web.config bestand Dit zou de volgende structuur moeten zijn:

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

Antwoord 10

Ik had hetzelfde probleem. Lees ze gewoon op deze manier:
System.Configuration.ConfigurationationSettingS.Appstellings [“MySetting”]


Antwoord 11

Stap 1: Klik met de rechtermuisknop op het tabblad Referenties om referentie toe te voegen.

Stap 2: klik op het tabblad Assemblies

Stap 3: zoek naar ‘systeem.configuratie’

Stap 4: klik op OK.

Dan werkt het.

string value = System.Configuration.ConfigurationManager.AppSettings["keyname"];

Antwoord 12

web.configwordt gebruikt met webtoepassingen. web.configStandaard heeft verschillende configuraties vereist voor de webtoepassing. U kunt een web.configvoor elke map onder uw webtoepassing hebben.

app.configwordt gebruikt voor Windows-toepassingen. Wanneer u de toepassing in Visual Studio bouwt, wordt deze automatisch hernoemd naar <appname>.exe.configen dit bestand moet samen met uw aanvraag worden afgeleverd.

U kunt dezelfde methode gebruiken om de app settings-waarden van beide configuratiebestanden te bellen:
System.Configuration.ConfigurationationSTingS.Appstellings [“Sleutel”]


Antwoord 13

Zoals ik de beste benadering heeft gevonden om toegang te krijgen tot applicatie-instellingenvariabelen op een systematische manier door een wikkelklasse over systeem te maken. Configuratie zoals hieronder

public class BaseConfiguration
{
    protected static object GetAppSetting(Type expectedType, string key)
    {
        string value = ConfigurationManager.AppSettings.Get(key);
        try
        {
            if (expectedType == typeof(int))
                return int.Parse(value);
            if (expectedType == typeof(string))
                return value;
            throw new Exception("Type not supported.");
        }
        catch (Exception ex)
        {
            throw new Exception(string.Format("Config key:{0} was expected to be of type {1} but was not.",
                key, expectedType), ex);
        }
    }
}

Nu hebben we toegang tot de benodigde instellingenvariabelen door harde gecodeerde namen met behulp van een andere klasse zoals hieronder:

public class ConfigurationSettings:BaseConfiguration
{
    #region App setting
    public static string ApplicationName
    {
        get { return (string)GetAppSetting(typeof(string), "ApplicationName"); }
    }
    public static string MailBccAddress
    {
        get { return (string)GetAppSetting(typeof(string), "MailBccAddress"); }
    }
    public static string DefaultConnection
    {
        get { return (string)GetAppSetting(typeof(string), "DefaultConnection"); }
    }
    #endregion App setting
    #region global setting
    #endregion global setting
}

Antwoord 14

Ik raad u ten zeerste aan om een ​​Wrapper voor deze oproep te maken. Iets als een ConfigurationReaderServiceen gebruik afhankelijkheid injectie om deze klasse te krijgen. Op deze manier kunt u deze configuratiebestanden voor testdoeleinden isoleren.

Gebruik dus de ConfigurationManager.AppSettings["something"];Aanbevolen en retourneer deze waarde. Met deze methode kunt u een soort standaard rendement maken als er geen toets beschikbaar is in het bestand.


Antwoord 15

Ook kunt u formo gebruiken:

Configuratie:

<appSettings>
    <add key="RetryAttempts" value="5" />
    <add key="ApplicationBuildDate" value="11/4/1999 6:23 AM" />
</appSettings>

Code:

dynamic config = new Configuration();
var retryAttempts1 = config.RetryAttempts;                 // Returns 5 as a string
var retryAttempts2 = config.RetryAttempts(10);             // Returns 5 if found in config, else 10
var retryAttempts3 = config.RetryAttempts(userInput, 10);  // Returns 5 if it exists in config, else userInput if not null, else 10
var appBuildDate = config.ApplicationBuildDate<DateTime>();

Antwoord 16

Voor de volledigheid is er nog een andere optie beschikbaar, alleen voor webprojecten:
System.Web.Configuration.WebConfigurationManager.AppSettings[“MySetting”]

Het voordeel hiervan is dat er geen extra referentie hoeft te worden toegevoegd, dus het kan voor sommige mensen de voorkeur hebben.


Antwoord 17

Ik maak altijd een IConfig-interface met typesafe-eigenschappen gedeclareerd voor alle configuratiewaarden. Een Config-implementatieklasse verpakt vervolgens de aanroepen naar System.Configuration. Al uw System.Configuration-aanroepen bevinden zich nu op één plek en het is zoveel gemakkelijker en schoner om te onderhouden en bij te houden welke velden worden gebruikt en om hun standaardwaarden te declareren. Ik schrijf een reeks privéhulpmethoden om algemene gegevenstypen te lezen en te ontleden.

Met behulp van een IoC-framework heeft u overal toegang tot de IConfig-velden in uw toepassing door simpelweg de interface naar een klassenconstructor. U kunt dan ook schijnimplementaties van de IConfig-interface maken in uw unit-tests, zodat u nu verschillende configuratiewaarden en waardecombinaties kunt testen zonder dat u uw App.config- of Web.config-bestand hoeft aan te raken.


Antwoord 18

De ConfigurationManager is niet wat u nodig hebt om toegang te krijgen tot uw eigen instellingen.

Om dit te doen, moet u

. gebruiken

{YourAppName}.Properties.Settings.{settingName}


Antwoord 19

Ik heb de onderstaande aanpak werkend gekregen voor .NET Core-projecten:

Stappen:

  1. Maak een appsels.json (formaat gegeven) in uw project.
  2. Maak vervolgens een configuratieklasse. Het formaat wordt hieronder verstrekt.
  3. Ik heb een login () -methode gemaakt om het gebruik van de configuratieklasse weer te geven.

    APPETINGSS.JSON in uw project maken met inhoud:

    {
      "Environments": {
        "QA": {
          "Url": "somevalue",
     "Username": "someuser",
          "Password": "somepwd"
      },
      "BrowserConfig": {
        "Browser": "Chrome",
        "Headless": "true"
      },
      "EnvironmentSelected": {
        "Environment": "QA"
      }
    }
    public static class Configuration
    {
        private static IConfiguration _configuration;
        static Configuration()
        {
            var builder = new ConfigurationBuilder()
                .AddJsonFile($"appsettings.json");
            _configuration = builder.Build();
        }
        public static Browser GetBrowser()
        {
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Firefox")
            {
                return Browser.Firefox;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "Edge")
            {
                return Browser.Edge;
            }
            if (_configuration.GetSection("BrowserConfig:Browser").Value == "IE")
            {
                return Browser.InternetExplorer;
            }
            return Browser.Chrome;
        }
        public static bool IsHeadless()
        {
            return _configuration.GetSection("BrowserConfig:Headless").Value == "true";
        }
        public static string GetEnvironment()
        {
            return _configuration.GetSection("EnvironmentSelected")["Environment"];
        }
        public static IConfigurationSection EnvironmentInfo()
        {
            var env = GetEnvironment();
            return _configuration.GetSection($@"Environments:{env}");
        }
    }
    public void Login()
    {
        var environment = Configuration.EnvironmentInfo();
        Email.SendKeys(environment["username"]);
        Password.SendKeys(environment["password"]);
        WaitForElementToBeClickableAndClick(_driver, SignIn);
    }
    

Antwoord 20

Als u de ConfigurationManagerClass gebruiken …

Mogelijk moet u System.Configuration.ConfigurationManagerdoor Microsoft Via Nuget Package Manager

Tools- & GT; Nuget Package Manager- & GT; Beheer Nuget-pakketten voor oplossing …

Microsoft Docs

Eén ding dat het vermelden waard is van de documenten …

Als uw aanvraag alleen-lezen toegang heeft tot zijn eigen configuratie,
We raden u aan om de methode van de nasy (string) te gebruiken. Deze methode
Biedt toegang tot de cache-configuratiewaarden voor de huidige
Toepassing, die betere prestaties heeft dan de configuratie
klasse.


Antwoord 21

Nog een mogelijke oplossing:

var MyReader = new System.Configuration.AppSettingsReader();
string keyvalue = MyReader.GetValue("keyalue",typeof(string)).ToString();

Antwoord 22

Ik heb geprobeerd een oplossing voor ditzelfde probleem nu een paar dagen te vinden. Ik was in staat om dit op te lossen door een sleutel toe te voegen binnen de tag van het appsels in het bestand Web.config . Dit moet het .dll-bestand overschrijven bij gebruik van de helper.

<configuration>
    <appSettings>
        <add key="loginUrl" value="~/RedirectValue.cshtml" />
        <add key="autoFormsAuthentication" value="false"/>
    </appSettings>
</configuration>

Antwoord 23

U kunt de onderstaande regel gebruiken. In mijn geval werkte het:
System.Configuration.ConfigurationationStingS.Appstellings [“YEKEKEYNAME”]

U moet ervoor zorgen dat de bovenstaande regel van de code ook de oude versie is en deze wordt afgeschreven in nieuwe bibliotheken.


Antwoord 24

Controleer de .NET-versie waaraan u werkt. Het zou hoger moeten zijn dan 4. en u moet het systeem van het systeem toevoegen. Configuratie-systeembibliotheek aan uw toepassing.


Antwoord 25

EXTRA: Als u aan een class-bibliotheekproject werkt, moet u de settings.json-bestand insluiten.

Een klassenbibliotheek mag niet echt rechtstreeks naar binnen verwijzen
app.config – de klas heeft geen app.config, omdat het geen
Toepassing, het is een klasse.

  1. Ga naar de eigenschappen van het JSON-bestand.
  2. Wijzigingsactie – & GT; Embedded resource.
  3. Gebruik de volgende code om het te lezen.

var assembly = Assembly.GetExecutingAssembly();

var resourceStream = assembly.GetManifestResourceStream("Assembly.file.json");

string myString = reader.ReadToEnd();

Nu hebben we een JSON-string die we het kunnen gebruiken met JsonConvert

Als u het bestand niet in de montage hebt ingediend, kunt u niet alleen het DLL-bestand gebruiken zonder het bestand


Antwoord 26

Hier is een voorbeeld: app.config

<applicationSettings>
    <MyApp.My.MySettings>
        <setting name="Printer" serializeAs="String">
            <value>1234 </value>
        </setting>
    </MyApp.My.MySettings>
</applicationSettings>
Dim strPrinterName as string = My.settings.Printer

Other episodes