2008-12-10 8 views
6

Ich verwende einen globalen benannten Mutex für die Dateizugriffssynchronisierung zwischen einer ASP.NET-Anwendung und einer Konsolenanwendung.C# mutex - Fehler beim Aufruf von ASP.NET und der Konsolenanwendung

Beim Ausführen der ASP.NET-Anwendung kann die Konsolenanwendung Mutex nicht wie erwartet erwerben. Beim Ausführen der Konsolenanwendung löst die ASP.NET-Anwendung UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

Ich werde versuchen, die Ausnahme abzufangen und behandeln wie es fehlgeschlagen, den Mutex zu erwerben, aber ich möchte wissen, warum verhält es sich so? Die ASP.NET-Anwendung wird wie erwartet ausgeführt, wenn auf sie von zwei verschiedenen Browsern aus zugegriffen wird, und die Konsolenanwendungen werden auch wie erwartet ausgeführt, wenn mehrere Instanzen ausgeführt werden.

Update: unter Windows XP wird die Ausnahme auch ausgelöst, wenn die ASP.NET-Anwendung ausgeführt wird und ich versuche, die Konsolenanwendung zu starten.

Der Code für die Synchronisation verwendet wird, ist in einer gemeinsamen Baugruppe:

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

    if(lock) 
    { 
    // ... 

    m.ReleaseMutex(); 
    } 
} 

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

Antwort

11

haben Sie den richtigen Benutzer einrichten, um den Zugriff auf die Ressourcen? mit

MutexSecurity and MutexAccessRule ? 

versuchen, diese auf MSDN suchen http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity.aspx

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

P. S. Ich erwarte eine Jon Skeet Antwort meine Unwissenheit in der Sache zu zeigen, ... =>

+2

Meine ‚Antwort‘ ist nur auf +1 deins, wie es genau richtig für mich aussieht :) –

+2

der Höhepunkt meines Tages - Jon Skeet hat mit mir gesprochen => Und glücklicher Tag vereinbart –

6

Hier wird die Probe von How to determine if a previous instance of my application is running? (siehe romkyns 'Antwort)

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); 
Verwandte Themen