Changer D'Application.config au moment de l'Exécution
Je suis en train d'écrire un test WinForms /C# /.NET 3.5 application pour le système que nous développons et nous sommes tombés dans le besoin de basculer entre les deux .les fichiers de configuration à l'exécution, mais c'est devenu un cauchemar.
Voici la scène: les WinForms application est destinée à tester une WebApp, divisé en 5 sous-systèmes. Le processus de test fonctionne avec des messages transmis entre les sous-systèmes, et pour cette réussite du processus de chaque sous-système obtenu d'avoir un son propre .fichier de configuration.
Pour mon Test de l'Application, j'ai écrit 5 fichiers de configuration séparés. Je voudrais être en mesure de basculer entre ces 5 fichiers lors de l'exécution, mais le problème est: je peux modifier par programmation de l'application .fichier de configuration à de nombreuses reprises, mais ces changements ne prendront effet qu'une fois. J'ai été la recherche d'un temps long pour un formulaire pour remédier à ce problème, mais je n'étais toujours pas réussi.
Je connais la définition du problème, peut-être un peu confus, mais je voudrais vraiment l'apprécier si quelqu'un m'a aidé.
Merci d'avance!
--- Mise à JOUR 01-06-10 ---
Il y a quelque chose que je n'ai pas mentionné avant. À l'origine, notre système est une Application Web avec WCF appels entre chaque sous-système. Pour les tests de performances raisons (nous sommes à l'aide de FOURMIS 4), nous avons dû créer une copie locale des assemblées et de référence de la projet de test. Il peut sembler un peu mal, mais nous ne pouvions pas trouver une manière satisfaisante pour mesurer les performances d'une application à distance.
--- Fin De Mise À Jour ---
Voici ce que j'ai fais:
public void UpdateAppSettings(string key, string value)
{
XmlDocument xmlDoc = XmlDocument.Load(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
foreach (XmlElement item in xmlDoc.DocumentElement)
{
foreach (XmlNode node in item.ChildNodes)
{
if (node.Name == key)
{
node.Attributes[0].Value = value;
break;
}
}
}
xmlDoc.Save(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile);
System.Configuration.ConfigurationManager.RefreshSection("section/subSection");
}
J'ai déjà essayé ces aproaches... le problème est, l'étiquette, je suis en train de changer à l'extérieur <appSettings>. J'ai aussi essayé de créer de nouveaux domaines d'application et de configuration différentes .les fichiers de configuration pour eux, mais il ne fonctionne pas non plus.
OriginalL'auteur born to hula | 2010-01-05
Vous devez vous connecter pour publier un commentaire.
Mise à JOUR
La solution ci-dessous n'a pas fonctionné car XmlDocument n'en dispose pas et il semble que certaines versions de .net ne fermez pas correctement face à un chemin d'accès au fichier. La solution (exemple de code dans le lien) est d'ouvrir un flux qui va faire jeter et passer ce flux de données pour la fonction d'enregistrement.
Une solution qui est montré ici. http://web-beta.archive.org/web/20150107004558/www.devnewsgroups.net/group/microsoft.public.dotnet.xml/topic40736.aspx
Vieux trucs ci-dessous
Essayez ceci:
Remarque, j'ai changé de xpath, mais il a été un moment j'ai eu le xpath mal, mais en tout cas, vous devriez utiliser xpath et non à pied de l'arbre. Comme vous pouvez le voir, il est beaucoup plus claire.
Le point important est le
using
déclarationdispose()
, ce qui je pense est votre problème.Laissez-moi savoir, bonne chance.
Oui, vous avez raison... voir mes commentaires ci-dessus.
Eh bien, j'ai une légère deviner que ce n'est pas le cas. Je suis en utilisant le framework .NET 3.5. D'ailleurs, je pense que si le flux de fichier était toujours ouverte, par le deuxième temps, je tenterai d'écrire dans le fichier xml, je voudrais obtenir une exception... mais merci quand même.
ummm... il y a documenté problème avec la .net framework avec des exemples de code qui ressemble exactement la même que la vôtre, je vous fournir un lien vers le code qui permet de résoudre ce problème et vous n'allez pas essayer? Ne voulez-vous pas à résoudre le problème?
Je vais faire un essai et de mise à jour vous avec les résultats. Merci pour votre aide.
OriginalL'auteur Hogan
Je comprends que c'est un assez vieux thread, mais je ne pouvais pas obtenir la liste des méthodes de travail. Voici une version simplifiée de la UpdateAppSettings méthode (à l'aide .NET 4.0):
Assez lisible, et évite d'avoir à traverser de l'application.config à l'aide de Xpath.
Remarque: Le code ci-dessus est inspiré de cette extrait sur MSDN.
OriginalL'auteur Sudhanshu Mishra
Ma conjecture est que vous ne sont pas vraiment la fermeture de la poignée de fichier la première fois, de sorte que windows ne permet pas de "voir" à vous de faire les modifications ultérieures.
Mes suggestions est d'utiliser un appel API pour les services IIS et désactiver l'application web (et la piscine), faire le changement, tourner sur l'application web. De cette façon, vous êtes sûr de re-lire le fichier et avoir un environnement "propre" pour chaque test.
OriginalL'auteur Hogan
En supposant que le descripteur de fichier pour le fichier de configuration est fermée après le fichier de configuration a été lu et traité, je voudrais envoyer un message à la demande de la raconter à re-lire le fichier de configuration après avoir mis à jour le fichier. Si cette approche ne fonctionne pas, alors je soupçonne (comme Hogan suggéré) que le handle de fichier n'est pas fermé. Ce que les codes d'erreur en êtes-vous de l'ouverture du fichier, la lecture et le système de fermeture des appels? (utiliser perror de signaler le message d'erreur)
pour hula: Comment changer la configuration @ runtime? Je voudrais utiliser la même approche pour l'application de relire le fichier de configuration. Quelle langue et en OS utilisez-vous? Quels sont les messages envoyés à la demande pendant les tests? L'entrée à la demande de venir à partir d'une page web? Répondre à ces questions permettrait de donner quelques indices sur la meilleure approche pour votre situation.
Je suis en utilisant XmlDocument de changer la .fichier de configuration (reportez-vous à la mise à jour de question). Mais, peu importe combien de fois je l'ai changer, les modifications ne seront effectives une fois sur le contexte d'exécution. Je suis à l'aide de C# et de Windows XP. L'entrée de l'application vient tout droit de la forme. Fondamentalement, l'entrée principale est un message, à partir de laquelle une variété d'objets est créé.
Oh, je suis en utilisant .NET 3.5.
pour hula: Mon expérience est sur Unix; pas sur Windows. Désolé.
OriginalL'auteur David Harris