私の ASP.NET MVC アプリケーションでは、すべての要求を順番に処理したいと考えています。アクション/コントローラー コードを別のコードと同時に実行する必要はありません。2 つの要求が同時に受信された場合、最初の要求が最初に実行され、最初の要求が完了したら 2 番目の要求が実行されます。
グローバルロック変数を使用する以外に、これを行うより良い方法はありますか?
編集: アプリケーションは、Web サービス呼び出しを実行し、データベースをクリーンアップする Web 上のバッチ/サービスです。サイト内の異なる URL は、異なるバッチ操作につながります。これはエンドユーザー向けのサイトではありません。したがって、URL への要求 (いくつかのバッチ操作を実行する) が一度に 1 つだけ実行されるようにする必要があります。そうしないと、バッチ操作のコードがそれ自体または他のバッチ操作と同時に実行されると、バッチ操作が破損する可能性があります。 . 実際、あるリクエストが現在実行されているときに別のリクエストが来た場合、前のリクエストが終了した後であっても、そのリクエストはまったく実行されるべきではありません。エラーメッセージが表示されるだけです。
コードではなく IIS でこれを行う方法があるかどうかを知りたいです。グローバルなロック変数を使用すると、コードがより複雑になり、ロック変数が true に設定されていても false に設定できないというデッドロックが発生する可能性があります。
EDIT:実装計画のサンプルコード
[HttpPost]
public ActionResult Batch1()
{
//Config.Lock is a global static boolean variable
if(Config.Lock) { Response.Write("Error: another batch process is running"); return View(); }
Config.Lock = true;
//Run some batch calls and web services (this code cannot be interleaved with ExecuteBatchCode2() or itself)
ExecuteBatchCode();
Config.Lock = false;
return View();
}
[HttpPost]
public ActionResult Batch2()
{
if(Config.Lock) { Response.Write("Error: another batch process is running"); return View(); }
Config.Lock = true;
//Run some batch calls and web services (this code cannot be interleaved with ExecuteBatchCode1() or itself)
ExecuteBatchCode2();
Config.Lock = false;
return View();
}
コードが Config.Lock = false に到達せず、Config.Lock = true が永遠に続き、リクエストが処理されなくなる場合について心配する必要がありますか?