12
votes

C # - Paramètres de l'utilisateur cassé

Nous avions une rare exception lors de la lecture des paramètres de l'utilisateur standard .NET (celles-ci figurent dans "Propriétés du projet" dans VS 2008):

//How we read
Settings settings = Settings.Default;
_ourStaticMemberVariable = settings.OurValue;

//How we save
Settings settings = Settings.Default;
settings.OurValue = "Our Value";
settings.Save();


0 commentaires

3 Réponses :


11
votes

La manière de récupérer par programme est de faire ce que vous avez fait manuellement - supprimez le fichier de paramètres utilisateur. puis appelez Paramètres.Reset . (Vous pouvez également écrire un nouveau fichier de paramètres utilisateur avec des valeurs par défaut au lieu de la supprimer, mais si vous utilisez correctement le gestionnaire de configuration, c'est essentiellement la même chose.)

C'est un événement assez rare, mais ce n'est pas totalement inouïs. Non seulement votre programme peut cracer lors de la rédaction du fichier de paramètres utilisateur, le fichier lui-même est utilisé par l'utilisateur, de sorte que d'autres programmes que l'utilisateur fonctionne pourrait gâcher avec elle.

Pour éviter cette vulnérabilité particulière, persistez les paramètres utilisateur dans un magasin durable avec une intégrité transactionnelle, c'est-à-dire une base de données. (Vous aurez toujours des vulnérabilités, tout simplement pas.) C'est beaucoup de travail pour ce que dans la plupart des cas sera une amélioration marginale de la fiabilité. Mais "dans la plupart des cas" ne signifie pas "dans tous les cas;" le tien peut le justifier.


7 commentaires

Comment puis-je obtenir le chemin du fichier de paramètres utilisateur? Une base de données est surchargée pour mon scénario.


Notez que l'InnErexception, de type System.Configuration.configurationErrorSexception, a une propriété Nom de fichier ...


Je suppose que je vais devoir faire une méthode d'assistance pour extraire le nom de fichier de l'exception interne ici.


String FileName = ((ConfigurationErrorSexception) E.innerexception) .Filename; devrait le faire.


Appel de réinitialisation () Après avoir supprimé le fichier entraînera la même exception. Vous devez redémarrer l'application après avoir supprimé le fichier de configuration. Détails ici: Connect.Microsoft.com/visualstudio/feedback/Détails/497189/...


Redémarrer l'application n'est pas si géniale ... merveille si cela peut être corrigé


Dans mon cas, j'ai vérifié l'exception interne comme suggérée par @technophile. J'ai ouvert le chemin, supprimé le fichier là-bas et a ensuite été capable de construire avec succès.



3
votes
[STAThread]
private static void Main(string[] args)
{
    try
    {
        // ...
    }
    catch (System.Configuration.ConfigurationErrorsException ex)
    {   
        var config = ((System.Configuration.ConfigurationErrorsException)ex.InnerException).Filename;
        // notify user, ask them to restart
        System.IO.File.Delete(config);
        Application.Exit();
    }
}

1 commentaires

C'est exactement ce que j'ai fait, sauf que je revienne mon application comme un nouveau processus plutôt que de sortir.



16
votes

Voici une solution qui ne vous oblige pas à quitter l'application avec Kudos à Jarle ( http://www.codeproject.com/articles/30216/handling-corrupt-user-config-settings?msg=3608682xxx3608682xx ). Tôt, avant que les paramètres ne soient appelés, utilisez ce xxx

essentiellement, plutôt que de compter sur des séances pour lancer l'erreur, lisez le fichier avec le configurationManager, de cette façon la version du système n'entre jamais dans un mauvais état.


2 commentaires

Quel est le fichierwatcher pour ?? Je pensais que Supprimer ne reviendra pas tant que le fichier ne sera supprimé


Tu serais surpris