7

ASP.NET アプリケーションとコンソール アプリケーション間のファイル アクセスの同期に、グローバルな名前付きミューテックスを使用しています。

ASP.NET アプリケーションの実行中に、コンソール アプリケーションがミューテックスの取得に失敗する - 予想どおり。コンソール アプリケーションの実行中に、ASP.NET アプリケーションがスローします。UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

例外をキャッチして、ミューテックスの取得に失敗したように処理しようとしますが、なぜこのように動作するのか知りたいですか? ASP.NET アプリケーションは、2 つの異なるブラウザーからアクセスした場合に期待どおりに実行され、コンソール アプリケーションも複数のインスタンスを実行している場合に期待どおりに実行されます。

更新: 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 に答える