C# mutex - 从 ASP.NET 和控制台应用程序调用错误

Posted

技术标签:

【中文标题】C# mutex - 从 ASP.NET 和控制台应用程序调用错误【英文标题】:C# mutex - error calling from ASP.NET and console application 【发布时间】:2008-12-10 11:51:17 【问题描述】:

我正在使用全局命名互斥锁来实现 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

【问题讨论】:

【参考方案1】:

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

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.mutexacces-s-rule.aspx

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

【讨论】:

我的“答案”只是对你的 +1,因为它看起来完全适合我 :) 我一天的高潮 - Jon Skeet 跟我说话 => 并同意快乐的一天【参考方案2】:

这里是来自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);

【讨论】:

以上是关于C# mutex - 从 ASP.NET 和控制台应用程序调用错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET, C# |如何在控制器中使用方法(和返回值)?

ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图

如何使用 c# asp.net 从 url 获取数据?

ASP.NET.NET和C#是什么关系???

在 ASP.NET MVC 中使用 AJAX 方法时使用 C# 控制器重定向到页面

如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?