.net Config Files configSource en dehors du répertoire d'application

j'ai deux applications une application console et l'autre une application ASP.NET app. Ils ont tous les deux besoin de connaître les mêmes appSettings et connections. Donc idéalement, je voudrais utiliser la propriété configSource d'app.config / web.les fichiers de configuration dans un emplacement central. Par exemple

<connectionStrings configSource="D:connectionStrings.config"/>
<appSettings configSource="D:appSettings.config"/>

qui échoue cependant avec une erreur:

l'attribut configSource n'est pas valide.: The configSource "D:appSettings.config ' est invalide. Il doit renvoyer à un fichier du même répertoire ou d'un sous-répertoire que le fichier de configuration.

y a-t-il de toute façon pour utiliser encore les appSettings/connections des gestionnaires de configuration et obtenir les valeurs à partir d'un emplacement externe?

Je suis content d'avoir à ajouter du code pour le faire, mais je ne veux pas avoir à remplacer tout le système de gestionnaire de configuration.

77
demandé sur Robert MacLean 2009-02-20 13:54:37

10 réponses

une Autre solution consiste simplement à ajouter le fichier de configuration dans tous vos projets comme un lien au lieu de copier le fichier à vos projets. Puis réglez le "Construire" du fichier "Contenu" et "Copier dans le Répertoire de Sortie" à "Copier si plus récent" et lorsque vous compilez le projet, vous aurez le fichier dans le répertoire de sortie.

pour ajouter le fichier comme lien dans la boîte de dialogue" Ajouter un élément existant", il y a un bouton Ajouter avec un menu déroulant. Choisissez "Ajouter comme lien" à partir de le menu déroulant sur le bouton Ajouter pour compléter le processus.

92
répondu Community 2018-03-07 23:06:19

sous appSettings vous pouvez utiliser file = au lieu de configSource=

30
répondu 2009-12-02 17:01:06

il semble que c'est comme ça. configSource doit être dans le même dossier ou plus profond.

vous pourrait , bien que je ne suis pas sûr que vous devrait , utilisez un lien dur NTFS.

16
répondu Iain M Norman 2009-02-20 11:03:33

vous pouvez charger la configuration à partir d'un emplacement arbitraire, mais il ne sera pas disponible via les propriétés statiques de ConfigurationManager:

Configuration myConfig = ConfigurationManager.OpenExeConfiguration(path)

(Il y a une surcharge qui permet multuple fichiers spécifiés, à l'appui de/par défaut de l'utilisateur de services d'itinérance et de l'utilisateur-hiérarchie locale.)

perdre les propriétés statiques signifie que tout le code doit être conscient de la configuration différente.

8
répondu Richard 2009-02-20 11:01:43

Visual Studio 2015

si vous avez ce problème avec Web.Config la réponse acceptée est correcte mais juste pour étendre puisque cela m'a fait me donner le visage-paume:

si vous ajoutez un .fichier de configuration de votre projet en utilisant "Ajouter un Lien", puis définir le lien de la Copie de la propriété de "Copier Si plus Récent" ou "Copie", puis le fichier sera copié dans le dossier /bin.

Ainsi, lorsque vous avoir une section de configuration définie dans Web.Config comme ceci:

 <section name="mySpecialConfig" type="System.Configuration.AppSettingsSection" requirePermission="false" />

alors vous devez définir l'élément de configuration comme ceci:

  <mySpecialConfig configSource="bin\MySpecialConfig.config">
  </mySpecialConfig>

tel que la source configs pointe vers la bin\MySpecialConfig physique.fichier de configuration pas au lien aussi, notez que le chemin est un relatif chemin physique.

cela peut sembler ridiculement évident mais si vous n'avez pas fait ceci avant que le fichier physique n'est pas encore dans le dossier \bin il peut donc cliquez pas tout de suite.

5
répondu Serexx 2016-07-16 07:30:57

vous pouvez placer les deux paramètres dans la machine .config et puis ils sont disponibles pour toutes vos applications sur le serveur.

3
répondu freggel 2009-02-20 11:01:39

la solution que j'ai trouvée la plus efficace a été de mettre les fichiers de configuration" partagés " dans un fichier central, puis d'utiliser un événement pré-construction dans Visual Studio pour les copier dans un dossier relatif de chaque projet qui en avait besoin.

2
répondu Robert MacLean 2009-03-11 11:02:14

j'ai eu un vrai combat avec ce problème, mais j'ai trouvé une bonne solution pour elle ici: essai avec l'externe config

(Vous pouvez diriger l'exécution des tests de copier des fichiers et répertoires dans le répertoire d'exécution en modifiant le .fichier testrunconfig.)

bien que la raison pour laquelle le projet unit test type peut obtenir des paramètres de configuration à partir de sa propre application.config, mais ne pas pouvoir charger les fichiers de configuration référencés comme une application normale.la config est type de déconcertant pour moi. J'appellerais ça un bogue parce que vous vous attendez à une application de projet de test.config se comporter de la même manière que l'application app.config se comporte, mais ce n'est pas le cas.

2
répondu marcel_g 2017-05-23 12:34:30

Dans le cas de chaînes de connexion, il est en effet possible de pointer vers un fichier partagé. Si le fichier partagé est sur un UNC réseau, il nécessite des privilèges administratifs sur la machine où l'application sera hébergée.

Solution: dans votre web.config, utilisez configSource pour pointer vers un fichier de configuration local. En raison des restrictions de .Net, cela doit être au niveau ou en dessous du niveau du fichier de configuration racine. Je me contente de pointer un fichier dans le dossier app lui-même:

<connectionStrings configSource="ConnectionStrings.config" />

dans un emplacement partagé qui est accessible par l'utilisateur du pool d'applications, ajouter le fichier de configuration contenant les chaînes de connexion partagées. Ce fichier ne doit pas contenir de xml autre que la section des cordons de connexion elle-même. Le fichier partagé, les cordons de connexion.config, ressemble à ceci:

<connectionStrings>
    <clear/>
    <add name="connString1" connectionString="connString1 info goes here"/>
    <add name="connString2" connectionString="connString2 info goes here"/>
</connectionStrings>  

maintenant l'astuce. Créez un lien symbolique Windows dans votre dossier app pointant vers le fichier de configuration partagé externe. Vous aurez besoin des privilèges admin pour cela:

mklink ConnectionStrings.config \someServer\someShare\someFolder\ConnectionStrings.config

nous venons de nous démarquer .Net. Le système de Configuration utilisera le paramètre configSource pour trouver des chaînes de connexion dans un fichier local appelé Connectionsstrings.config. Le lien symbolique ressemble à un fichier vers .Net, et le lien symbolique se résout au fichier de configuration partagée.

mises en garde: les modifications au fichier partagé ne déclenchent pas automatiquement un redémarrage de l'application .Net. Dans le cas D'IIS, le site web ou le pool d'applications devra être redémarré manuellement.

en raison de la nécessité de privilèges administratifs pour créer le lien symbolique, cette approche peut ne pas fonctionner pour tout le monde. Il existe deux alternatives connexes qui peuvent fonctionner si le fichier partagé est sur le même disque logique - liens durs et jonctions. Voir cette discussion et cette discussion pour plus d'informations.

2
répondu Scott 2017-03-17 13:14:45

vous pouvez utiliser l'attribut file plutôt que configSource

il y a un bon article ici dessus

Cela vous permet de spécifier un chemin relatif comme

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings file="..\..\..\..\..\..\ExternalFile.config"></appSettings>
</configuration>

Le chemin est relatif au répertoire de sortie.

puis dans ExternalFile.vous n'avez qu'à ajouter la section appSettings 151960920"

<appSettings>
    <add key="SomeKey" value="alue"/>
</appSettings>
1
répondu alexs 2018-08-01 19:18:34