2011-02-10 6 views
0

Nous avons un grand serveur d'application e-business qui est hors de notre contrôle, nous ne pouvons pas le modifier de quelque façon que ce soit. La société derrière ce serveur d'application ne le modifiera pas non plus selon les exigences de nos clients. Cela est dû au fait qu'ils nous considèrent comme un concurrent et qu'ils ne souhaitent pas que le client utilise notre application comme interface pour leur application.Manipulation des fichiers .lock

Notre application de bureau utilise des services Web pour communiquer avec ce serveur d'applications et chaque connexion du bureau occupe un emplacement utilisateur sur le serveur. Le serveur d'application ne propose aucune fonctionnalité permettant de déterminer si un emplacement utilisateur est utilisé ou non. La meilleure solution serait pour nous de développer une application qui se trouve au milieu du serveur d'applications et notre client de bureau, cette application permettrait de gérer l'allocation et la désallocation des emplacements d'utilisateurs et le problème est résolu. Cette solution a été refusée car le client ne veut pas installer notre application sur le serveur d'application e-business car cela annulerait le support utilisateur du serveur e-business, l'alternative serait un serveur supplémentaire mais c'est quelque chose qu'ils ne font pas. Je veux faire face.

Ce qui nous laisse avec la solution que notre application de bureau a un accès en écriture à un dossier partagé. Chaque application de bureau a un UID et nous utilisons cet UID avec l'ID de l'utilisateur et créons un fichier UID.UserSlotId.locked. Cela signifie que chaque fois qu'une connexion est établie, l'application de bureau doit vérifier cet emplacement partagé et s'assurer qu'ils ne sont pas sur le point d'utiliser un UserSlotId.

Maintenant, maintenant que le fichier verrouillé est une solution terrible, mais le client a demandé cela et peu importe combien nous les informons que ce ne sera jamais une solution étanche, ils veulent toujours aller de l'avant. Ils partent du principe qu'une solution à 98% est une bonne solution. Alors, que peut offrir la communauté StackOverflow en matière de conseil sur un tel système de verrouillage de fichier?

Répondre

0

Ouvrez le fichier de verrouillage en mode écriture et laissez-le ouvert pendant que l'application utilise un logement.

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) { } 
    } 
} 

J'ai testé comme celui-ci

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); 

sortie était

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 

Au lieu de garder le tableau de currentLock vous stockez une seule serrure par application. Vous devez stocker le FileStream ouvert pour vous assurer que le fichier reste ouvert en mode écriture. Pour libérer le verrou, vous disposez du FileStream stocké, puis le verrou d'écriture sur le fichier est libéré.
Cette méthode garantit que les verrous sont libérés même si votre application se bloque.

+0

Comment cette procédure pourrait-elle supporter 200 utilisateurs simultanés? Cela causerait-il des problèmes? – Mouse

+0

@Mouse. En supposant qu'ils gardent leurs connexions ouvertes pendant que l'application est ouverte et ne créent pas une nouvelle connexion pour chaque touche qu'ils appuient. Pour 200 utilisateurs je voudrais essayer de vérifier les fichiers de verrouillage dans un ordre aléatoire et peut-être d'abord essayer le dernier fichier de verrouillage que l'application a réussi à acquérir. –