我使用全局命名的互斥锁来实现ASP.NET应用程序和控制台应用程序之间的文件访问同步。
在运行ASP.NET应用程序时,控制台应用程序无法获得互斥锁 - 正如预期的那样。在运行控制台应用程序时,ASP.NET应用程序抛出UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.
我会尝试捕获异常并将其视为未能获取互斥锁,但我想知道为什么它会像这样?如果从两个不同的浏览器访问ASP.NET应用程序,并且运行多个实例时控制台应用程序也按预期运行,则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
答案 0 :(得分: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
P.S。我正在等待Jon Skeet的回答,以表明我对此事的无知...... =>
答案 1 :(得分:6)
来自How to determine if a previous instance of my application is running?的示例(请参阅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);