2011-02-10 24 views
0

我們有一個超出我們控制範圍的大型電子商務應用程序服務器,我們無法以任何形式或形式修改它。該應用服務器背後的公司也不會根據我們的客戶要求進行修改。這是因爲他們認爲我們是競爭對手,他們不希望客戶使用我們的應用程序作爲其應用程序的前端。處理.lock文件

我們的桌面應用程序使用Web服務與此應用程序服務器進行通信,並且桌面上的每個登錄都佔用服務器上的用戶插槽。應用程序服務器不提供使我們能夠確定用戶插槽是否被佔用的功能。最好的解決方案將是我們開發一個位於應用程序服務器和桌面客戶端中間的應用程序,該應用程序將管理用戶插槽的分配和釋放,並解決問題。由於客戶不希望在電子商務應用程序服務器上安裝我們的應用程序,因此該解決方案已被拒絕,因爲這將使所述電子商務服務器的用戶支持無效,替代方案將是額外的服務器,但是這是他們不願意的。不想處理。

這給我們留下了我們的桌面應用程序可以對共享文件夾寫入訪問權限的解決方案。每個桌面應用程序都有一個UID,我們將該UID與用戶插槽ID一起使用,並創建一個文件UID.UserSlotId.locked。這意味着每次建立連接時,桌面應用程序都需要檢查此共享位置,並確保它們不打算使用所採用的UserSlotId。

現在我現在鎖定的文件是一個可怕的解決方案,但客戶已經要求這一點,無論我們告訴他們這絕不是一個水密解決方案,他們仍然想繼續。他們假設98%的解決方案是一個很好的解決方案。那麼StackOverflow社區能夠以建議的方式處理這樣的文件鎖定系統呢?

回答

0

以寫入模式打開鎖定文件,並在應用程序使用插槽時保持打開狀態。

private static void TakeFistUnusedLock(FileStream[] currentLock) 
{ 
    for (int i = 1; i < 5; i++) 
    { 
     try 
     { 
      var fs = File.OpenWrite(Path.Combine(Path.GetTempPath(), "DbLock", i.ToString() + ".lock")); 
      currentLock[i - 1] = fs; 
      Console.WriteLine("Got lock " + i); 
      break; 
     } 
     catch (Exception) { } 
    } 
} 

我測試了這樣

FileStream[] currentLock = new FileStream[5]; 
var path = Path.Combine(Path.GetTempPath(), "DbLock"); 
DirectoryInfo di = new DirectoryInfo(path); 
di.Create(); 


TakeFistUnusedLock(currentLock); 
TakeFistUnusedLock(currentLock); 
TakeFistUnusedLock(currentLock); 

currentLock[1].Dispose(); // release lock 2 

TakeFistUnusedLock(currentLock); 

產量

Got lock 1 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 2 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 3 
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
Got lock 2 

而不是保持currentLock陣列只爲每個應用存儲一個鎖。您需要存儲打開的FileStream以確保文件在寫入模式下保持打開狀態。爲了釋放鎖,你需要處理存儲的FileStream,然後釋放文件上的寫入鎖。
此方法可確保即使應用程序崩潰也會釋放鎖。

+0

該程序如何支持200個併發用戶?會導致問題嗎? – Mouse 2011-02-11 04:38:22