2008-12-10 26 views
6

Tôi đang sử dụng một mutex được đặt tên chung cho đồng bộ hóa truy cập tệp giữa một ứng dụng ASP.NET và một ứng dụng giao diện điều khiển.C# mutex - lỗi gọi từ ASP.NET và giao diện điều khiển ứng dụng

Trong khi chạy ứng dụng ASP.NET, ứng dụng bảng điều khiển không có được mutex - như mong đợi. Trong khi chạy ứng dụng giao diện điều khiển, ứng dụng ASP.NET ném UnauthorizedAccessException: Access to the path 'Global\TheNameOfTheMutex' is denied.

Tôi sẽ cố gắng loại trừ ngoại lệ và xử lý nó giống như nó không có được mutex, nhưng tôi muốn biết tại sao nó hoạt động như thế này? Ứng dụng ASP.NET chạy như mong đợi nếu nó được truy cập từ hai trình duyệt khác nhau và các ứng dụng giao diện điều khiển cũng chạy như mong đợi khi chạy nhiều phiên bản.

Cập nhật: trên Windows XP ngoại lệ cũng được ném khi ứng dụng ASP.NET đang chạy và tôi cố gắng khởi động ứng dụng bảng điều khiển.

Các mã được sử dụng để đồng bộ hóa là trong một hội đồng chung:

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

    if(lock) 
    { 
    // ... 

    m.ReleaseMutex(); 
    } 
} 

Môi trường: Windows Server 2008, IIS 7, ASP.NET 2.0

Trả lời

11

Bạn đã chọn đúng người dùng thiết lập để truy cập vào các nguồn tài nguyên? sử dụng

MutexSecurity and MutexAccessRule ? 

thử nhìn vào này trên 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

tái bút: Tôi đang chờ đợi một câu trả lời Jon Skeet để hiển thị sự thiếu hiểu biết của tôi về vấn đề này ... =>

+2

'câu trả lời' tôi là chỉ để 1 của bạn, vì nó có vẻ chính xác với tôi :) –

+2

điểm cao trong ngày của tôi - Jon Skeet đã nói chuyện với tôi => Và ngày vui vẻ đồng ý –

6

Đây là mẫu từ How to determine if a previous instance of my application is running? (xem 'Câu trả lời 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ác vấn đề liên quan