2010-09-20 5 views
1

J'ai un fichier XML et j'enregistre certains de mes paramètres d'application.
J'ai lu ce fichier xml et le cache en mémoire, si je change le paramètre que je veux lire le dernier changement de fichier xml, mais comment puis-je savoir que, le fichier xml est modifié?Recharger le fichier xml en cas de modification

Im l'exécution de cette application dans le contexte web (asp.net)

+0

Vous allez faire le changement dans le fichier XML, non? Est-ce qu'une autre application apportera des modifications à votre fichier XML?Si non, je pense que vous devriez savoir réellement quand un changement arrive au fichier XML, parce que vous serez celui qui fait le changement :) –

Répondre

1

L'option 'FileSystemWatcher' a été répondu, mais vous pouvez également utiliser le cache ASP.NET avec un 'depenency de fichier'.

Je suppose que vous ne voulez pas les mises à jour en temps réel envoyées au navigateur, vous voulez juste utiliser le nouveau côté serveur valeurs lorsqu'un autre code est en cours d'exécution. Au démarrage de l'application, votre application lit le fichier et insère l'objet settings dans le cache ASP.NET avec une 'dépendance de fichier'. Chaque fois que votre code vérifie pour voir si l'objet est dans le cache et s'il trouve, il continue à utiliser le même objet. Quand le fichier change, vous l'aurez deviné, le cache va expulser l'ancienne copie de vos paramètres, ce qui signifie que vous aurez zéro à partir du cache. À ce stade, le chemin de votre code de démarrage s'exécute à nouveau, recharge le fichier et insère le nouvel objet de configuration dans le cache (avec la dépendance). Le cache ASP.NET est threadsafe, et aussi longtemps que votre désérialisation ne provoque pas d'effets secondaires, il est sûr de lire et d'insérer sans verrouillage ou synchronisation. (Cela signifie qu'il est possible que deux requêtes/threads relisent le fichier de paramètres mis à jour en même temps, mais cela est généralement OK, tant que le fichier est petit.) IIRC la solution FileSystemWatcher est plus difficile à obtenir et nécessite synchronisation.

http://www.dotnetfunda.com/articles/article791-data-caching-with-file-dependency-in-aspnet-.aspx

+1

est-ce que FileSystemWatcher fonctionne dans un contexte web qui est sans état? – Ehsan

+0

Je crois que la question des apatrides a été répondue. Je suppose que vous ne vous souciez pas du changement de fichier tout en répondant à une seule requête, mais vous vous souciez de vider toutes les données chargées du fichier lorsque le fichier change entre ou pendant une demande. L'entrée de cache avec la dépendance le fera. – yzorg

0

Je ne sais pas si cela va fonctionner bien dans un contexte de webservice (il y a des visites sur le Web à l'utiliser dans ce scénario), mais vous pouvez utiliser la classe FileSystemWatcher.

Il peut y avoir des raisons de ne pas ce faire, cependant. Au moins une équipe sur laquelle j'ai travaillé avait des raisons de sécurité pour éviter d'exécuter automatiquement du code sur les modifications apportées à leur fichier de configuration. Au lieu de cela, ils ont choisi de recharger périodiquement le fichier, indépendamment des changements (toutes les 30 secondes).

En fonction de vos besoins, vous pouvez aussi être en mesure de stocker vos paramètres dans une table de base de données et d'éviter les valeurs de mise en cache dans votre code. Cela vous permet de tirer parti des fonctionnalités DB (historique, annulation, modification à distance, autorisations, en tirant parti de toute stratégie de déploiement/sauvegarde DB existante) et vous permet d'utiliser cette configuration dans les procédures stockées, et pas seulement dans votre code de service Web.

3

Vous pouvez utiliser une classe FileSystemWatcher pour surveiller le fichier.

Alternativement, vous pouvez envisager les paramètres d'épargne dans le fichier web.config, que ce soit dans appsettings ou une section de configuration personnalisée. Votre application Web se rechargera automatiquement lorsque votre configuration changera.

+0

Je n'ai pas regardé cela depuis .NET 2.0, mais je crois que tout changement à web.config provoque un rechargement de domaine, ce qui peut provoquer une pause notable dans l'application Web par rapport à la solution originale de 'seperate file'. – yzorg

+0

En effet, changer web.config rechargera le domaine de l'application. Cela peut poser un problème si vos paramètres changent fréquemment, mais pas s'ils changent rarement. –

+0

J'ai également rencontré des problèmes de cohérence avec la classe FileSystemWatcher. Ceux-ci ont peut-être été dans .NET 1.1, mais ils m'ont fait peur de faire confiance à la classe complètement. –

2

si vous mettez vos paramètres d'application dans un fichier app.config vous pouvez forcer une mise à jour des paramètres mises en cache:

//update app settings 
ConfigurationManager.RefreshSection("appSettings"); 
1

Utilisez FileSystemWatcher

public class MessageFileWatcher 
{ 
    public MessageFileWatcher(string Path, string FileName) 
    { 
     FileSystemWatcher Watcher = new FileSystemWatcher(); 
     Watcher.Path = Path; 
     Watcher.Filter = FileName; 
     Watcher.NotifyFilter = NotifyFilters.LastWrite; 
     Watcher.Changed += new FileSystemEventHandler(OnChanged); 
     Watcher.EnableRaisingEvents = true; 
    } 

    private void OnChanged(object source, FileSystemEventArgs e) 
    { 
     // Do something here based on the change to the file 
    } 
} 
+0

Votre exemple ne prend pas en compte de nombreux problèmes qui peuvent survenir: renommer, déplacer, supprimer, accéder pendant ou même avant qu'il ne soit créé ... – Wernight

Questions connexes