web-dev-qa-db-fra.com

Comment lire le fichier web.config dans l'application .Net Core

J'ai créé une API .Net Core et j'ai référencé une application de framework .Net. L'application référencée se connecte à une base de données et sa chaîne de connexion est stockée dans le fichier web.config:

    string CONNSTR =ConfigurationManager.ConnectionStrings["SHOPPINGCNN"].ConnectionString;

L'application .Net Core utilise appsettings.json au lieu du fichier web.config. Lorsque j'exécute l'API et que j'essaie d'utiliser les ressources de l'application référencée, le code ci-dessus est déclenché et renvoie la valeur null, car aucun fichier web.config n'existe dans l'application .net Core. Quelle est la meilleure solution pour résoudre ce problème

17
Zuhair

Étant donné que les applications .Net Core sont auto-hébergées et peuvent presque s'exécuter sur n'importe quelle plate-forme, elles ne sont plus hébergées sur ISS. Les paramètres de l’application .Net Core sont stockés au format Json (appsettings.json) par défaut lorsque les configurations d’application .Net Framework sont stockées dans un web.config fichier au format XML. Pour plus d'informations sur les applications .Net Core, vous pouvez lire Configuration dans ASP.NET Core . Dans mon cas, j'essayais d'accéder à la couche de données d'un .NET Framework Assembly à partir d'un .NET Core 2.0 Assembly. Pour ce faire, il n'est pas nécessaire d'installer System.Configuration.ConfigurationManager package l’application .Net Core mais il vous suffit d’ajouter app.config à .Net Core Assembly, puis ajoutez-lui la chaîne de connexion:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="SHOPPINGCNN" connectionString="server=your server name;integrated security=true;database=your database name" />
  </connectionStrings>
</configuration>

et tout ira bien. Assurez-vous que vous utilisez le même nom de chaîne de connexion (SHOPPINGCNN dans mon cas) que celui que vous avez utilisé dans votre application .Net Framework, sinon vous n'obtiendrez pas le résultat souhaité. Je l'ai fait dans mon projet et ça marche à 100%

10
Zuhair

dans le noyau .net, vous pouvez utiliser ConfigurationBuilder pour lire le fichier appsettings.json.

Vous pouvez implémenter comme suit.

exemple de appsettings.json

{
  "option1": "value1_from_json",
  "option2": 2,

  "ConnectionStrings": {
    "YourConnectionString": "............."
  }
}

exemple de code C #

static class YourClass
{
    public static IConfigurationRoot Configuration;

    public static string GetConnectionString()
    {
         var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json");

         Configuration = builder.Build();
         var connectionString = Configuration["ConnectionStrings:YourConnectionString"];

    }

}
10
hasan

Pour les applications .NET Core, le meilleur moyen consiste à utiliser API de configuration . C’est une méthode très flexible et, grâce au modèle de fournisseur, elle permet d’utiliser différentes sources, pas seulement le fichier appsettings.json Le plus courant (c’est-à-dire un fichier JSON pouvant être nommé de manière aléatoire). ):

  • Formats de fichier (INI, JSON et XML)
  • Arguments de ligne de commande
  • Variables d'environnement
  • Objets .NET en mémoire
  • Un magasin d'utilisateur chiffré Azure Key Vault
  • Fournisseurs personnalisés, que vous installez ou créez

Parlons maintenant de ConfigurationManager. Au début, le noyau .NET avait été contraint d'oublier cette classe. Elle n'était ni implémentée ni prise en charge. L'idée était de la remplacer complètement en fournissant une nouvelle API de configuration.

De plus, la réalité est que les applications ASP.NET Core ne sont plus hébergées via IIS (IIS fonctionne principalement comme un proxy inverse maintenant)), et le web.config Ne l'est plus. plus utile (sauf dans de rares cas où vous avez encore besoin de définir des paramètres spécifiques à IIS)).

Cependant, après la fourniture de .NET Standard 2.0, ce package de nugets System.Configuration.ConfigurationManager est disponible et ramène la classe ConfigurationManager. Cela est devenu possible grâce au nouveau compatibilité shim implémenté dans le nouveau .NET Core 2.0.

En ce qui concerne votre cas, il est difficile de dire pourquoi vous avez 'nul' car ce n'est pas assez d'informations:

  • cela peut être une mauvaise section dans web.config
  • web.config ne peut pas être copié dans votre dossier de sortie/publication
7
Set

Au cas où vous l'auriez manqué - et parce que @Zuhair ne semble pas vouloir poster de réponse - voici un copier-coller de leur solution (j'ai raté ça au début car c'était seulement dans un commentaire):

J'ai trouvé la solution. J'ai changé le nom du fichier Web.config en app.config et j'ai pu obtenir la chaîne de connexion à l'aide de:

System.Configuration.ConfigurationManager.ConnectionStrings ["SHOPPINGCNN"]. ConnectionString

Le fichier app.config ressemble à ceci:

<?xml version="1.0"> encoding="utf-8" ?> 
<configuration> 
<connectionStrings> 
<add name="SHOPPINGCNN" connectionString="server=.\SQLEXPRESS;integrated security=true;database=xxxxx" /> 
</connectionStrings> 
</configuration>

Vous devez également installer ce paquet NuGet:

System.Configuration.ConfigurationManager

Dans mon cas, j'ai simplement renommé web.config contenant le connectionString 'app.config' et cela a fonctionné.

Je me rends compte que ce n’est probablement pas une bonne solution à long terme, mais pour des projets à la fois hétérogènes - ou pour avoir un pied dans la porte pour commencer à apprendre .net Core, cela est très utile.

6
niico