7

我正在使用全局命名互斥锁在 ASP.NET 应用程序和控制台应用程序之间进行文件访问同步。

在运行 ASP.NET 应用程序时,控制台应用程序无法按预期获取互斥锁。运行控制台应用程序时,ASP.NET 应用程序抛出UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

我将尝试捕获异常并将其视为未能获取互斥锁,但我想知道它为什么会这样?如果从两个不同的浏览器访问 ASP.NET 应用程序,则它会按预期运行,并且控制台应用程序在运行多个实例时也会按预期运行。

更新:在 Windows XP 上,当 ASP.NET 应用程序运行并且我尝试启动控制台应用程序时,也会引发异常。

用于同步的代码在一个通用程序集中:

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

  if(lock)
  {
    // ...

    m.ReleaseMutex();
  }
}

环境:Windows Server 2008、IIS 7、ASP.NET 2.0

4

2 回答 2

11

您是否设置了正确的用户来访问资源?使用

MutexSecurity and MutexAccessRule ?

尝试在 MSDN http://msdn.microsoft.com/en-us/library/system.security.accesscontrol.mutexsecurity.aspx上查看这个

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

ps 我正在等待 Jon Skeet 的回答,以表明我对此事的无知...=>

于 2008-12-10T11:58:07.773 回答
7

这里的示例来自如何确定我的应用程序的先前实例是否正在运行?(见romkyns的回答)

    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);
于 2010-08-11T07:07:09.827 回答