C # mutex - ошибка вызова из ASP.NET и консольного приложения

Я использую глобальный по имени мьютекс для синхронизации доступа к файлу между приложением 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

10.12.2008 11:51:17
2 ОТВЕТА
РЕШЕНИЕ

у вас есть правильный пользователь, настроенный для доступа к ресурсам? с помощью

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 Я жду ответа Джона Скита, чтобы показать свое невежество в этом вопросе ... =>

11
10.12.2008 11:58:07
Мой «ответ» - это просто +1 к вам, так как он выглядит для меня совершенно верно :)
Jon Skeet 10.12.2008 12:11:47

Вот пример из Как определить, работает ли предыдущий экземпляр моего приложения? (см. ответ ромкинов )

    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);
6
23.05.2017 12:13:38