2008-12-10 9 views
6

J'utilise un mutex global nommé pour la synchronisation d'accès au fichier entre une application ASP.NET et une application console. Lors de l'exécution de l'application ASP.NET, l'application de la console ne parvient pas à acquérir le mutex, comme prévu, pendant l'exécution de l'application ASP.NET. Lors de l'exécution de l'application console, l'application ASP.NET lance UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.C# mutex - appel d'erreur depuis ASP.NET et l'application console

Je vais essayer d'attraper l'exception et de la traiter comme si elle n'avait pas réussi à acquérir le mutex, mais je veux savoir pourquoi elle se comporte ainsi? L'application ASP.NET s'exécute comme prévu si elle est accessible à partir de deux navigateurs différents et les applications de console s'exécutent également comme prévu lors de l'exécution de plusieurs instances.

Mise à jour: sous Windows XP l'exception est également levée lorsque l'application ASP.NET est en cours d'exécution et j'essaie de démarrer l'application de console.

Le code utilisé pour la synchronisation est dans un ensemble commun:

using (Mutex m = new Mutex(false, "Global\\TheNameOfTheMutex")) // exception thrown 
{ 
    try 
    { 
    lock = m.WaitOne(0, false); 
    } 
    catch (AbandonedMutexException) 
    { 
    // ... 
    } 

    if(lock) 
    { 
    // ... 

    m.ReleaseMutex(); 
    } 
} 

Environnement: Windows Server 2008, IIS 7, ASP.NET 2.0

Répondre

11

vous avez l'utilisateur droit mis en place pour accéder à les ressources? en utilisant

MutexSecurity and MutexAccessRule ? 

essayer de regarder ce sur MSDN http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity.aspx

et http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexaccessrule.aspx

P.S. Je suis en attente d'une réponse Jon Skeet pour montrer mon ignorance en la matière ... =>

+2

Ma « réponse » est juste +1 le vôtre, comme il me semble exactement à droite :) –

+2

le point culminant de ma journée - Jon Skeet m'a parlé => Et le jour heureux convenu –

6

Voici l'échantillon de How to determine if a previous instance of my application is running? (voir romkyns 'réponse)

var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); 
    var mutexsecurity = new MutexSecurity(); 
    mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow)); 
    mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.ChangePermissions, AccessControlType.Deny)); 
    mutexsecurity.AddAccessRule(new MutexAccessRule(sid, MutexRights.Delete, AccessControlType.Deny)); 
    _mutex = new Mutex(false, "Global\\YourAppName-{add-your-random-chars}", out created, mutexsecurity);