0

私たちの管理下にない大規模な e ビジネス アプリケーション サーバーがあり、その形状や形式を変更することはできません。このアプリケーション サーバーの背後にある会社も、顧客の要件に合わせて変更することはありません。これは、彼らが私たちを競合他社と見なしており、顧客がアプリケーションのフロントエンドとして私たちのアプリケーションを使用することを望んでいないという事実によるものです.

デスクトップ アプリケーションは Web サービスを使用してこのアプリケーション サーバーと通信し、デスクトップからの各ログインはサーバー上のユーザー スロットを占有します。アプリケーション サーバーには、ユーザー スロットが使用されているかどうかを判断できる機能はありません。最善の解決策は、アプリケーション サーバーとデスクトップ クライアントの中間に位置するアプリケーションを開発することです。このアプリケーションはユーザー スロットの割り当てと割り当て解除を管理し、問題は解決されます。このソリューションは、顧客が e ビジネス アプリケーション サーバーに当社のアプリケーションをインストールすることを望んでいないため、拒否されました。対処したくない。

これにより、デスクトップ アプリケーションが共有フォルダーへの書き込みアクセス権を持つという解決策が得られます。各デスクトップ アプリケーションには UID があり、その UID をユーザー スロット ID と共に使用して、ファイル UID.UserSlotId.locked を作成します。これは、接続が確立されるたびに、デスクトップ アプリケーションがこの共有の場所をチェックし、取得された UserSlotId を使用しようとしていないことを確認する必要があることを意味します。

ロックされたファイルはひどい解決策であることがわかりましたが、顧客はこれを要求しており、これが完全な解決策ではないことをいくら伝えても、顧客は引き続き先に進みたいと考えています。彼らは、98% のソリューションが適切なソリューションであると仮定しています。では、このようなファイル ロック システムへの対処に関して、StackOverflow コミュニティはどのようなアドバイスを提供できるのでしょうか?

4

1 に答える 1

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配列を保持する代わりに、アプリケーションごとに1つのロックのみを格納します。ファイルが書き込みモードで開いたままになるように、開いたFileStreamを保存する必要があります。ロックを解除するには、保存されているFileStreamを破棄してから、ファイルの書き込みロックを解除します。
この方法により、アプリケーションがクラッシュした場合でもロックが確実に解除されます。

于 2011-02-10T21:22:19.030 に答える