2010-04-27 4 views
0

J'ai une application asp.net qui utilise le fichier (quelque chose comme DB fabriqué à la main). Il ouvre le fichier en mode non partagé. C'est pourquoi une seule instance de site peut l'utiliser.Problème avec plusieurs instances d'application asp.net

Mais les problèmes commencent quand je suis mise à jour du site sur le serveur (via app_offline.htm trick)

Parfois, l'instance mise à jour de AppDomain commence avant l'ancienne application est arrêté. J'ai 2 instances de AppDomain fonctionnant en même temps.

Existe-t-il un moyen standard pour l'empêcher?

PS: Je connais le paramètre "Recouvrement superposé" dans le pool d'applications, mais c'est autre chose. C'est pour plusieurs pools d'applications fonctionnant en même temps, mais j'ai un pool d'applications unique avec plusieurs instances de la même application.

+0

Je ne sais pas de façon standard, mais je pense que la grande chose non standard est un accès unique ici 'DB fait à la main' ... – Paddy

+0

Peu importe quel type de stockage j'utilise, le problème est avec l'accès non partagé. Le paramètre "Recyclage superposé" dans le pool d'applications a également été conçu pour ces raisons. – murad

Répondre

0

This article explique parfaitement la situation.

Pour résoudre mon problème, je dois utiliser

HostingEnvironment.RegisterObject()

0

J'ai trouvé la solution suivante

internal class AppInstanceSyncronizer 
    { 
    bool m_HasHandle; 
    EventWaitHandle m_Event; 

    const int START_TIMEOUT_MILLISECONDS = 60 * 1000; 

    const string GLOBAL_EVENT_NAME="{D22555A0-BF47-41fd-AFC9-D83B4EADF75C}"; 

    internal bool OnAppStart() 
     { 
     bool createdNew; 
     m_Event = new EventWaitHandle(false,EventResetMode.AutoReset,GLOBAL_EVENT_NAME,out createdNew); 
     if(createdNew) { m_Event.Set(); } 
     //--- first time created event 
     m_HasHandle = m_Event.WaitOne(START_TIMEOUT_MILLISECONDS); 
     return m_HasHandle; 
     } 

    internal void OnAppEnd() 
     { 
     //--- Release the event 
     if(m_HasHandle) 
     m_Event.Set(); 
     } 

Il suffit d'appeler OnAppStart et OnAppEnd où votre application démarre et arrête

Questions connexes