3

IIS が ASP.Net (2.0) Web アプリケーションを再起動すると、次のいずれかが可能になります。

  • AppDomain のリサイクル: AppDomain をアンロードし、同じプロセスで新しい AppDomain をロードします (たとえば、HttpRuntime.UnloadAppDomain()が呼び出されたとき、web.config が変更されたとき)。
  • プロセスのリサイクル: AppDomain をアンロードし、新しいプロセスに新しいプロセスをロードします (たとえば、inetmgr を介して AppPool で Recycle コマンドを呼び出すとき、またはメモリ制限に達したとき)。

いくつかの内部的な理由 (依存しているレガシー ネイティブ コードの問題) により、最初のオプションは許可できません。同じプロセスでアプリケーションを 2 回ロードすることはできません。

ワーカー プロセスの再利用を許可しないように IIS に指示することはできますか?

Mutex を使用してアプリケーションがプロセス上で既に開始されているかどうかを追跡し、そうであれば - 中に例外をスローすることで、自分でそれを防ごうとしましたApplication_Start()); Environment.Exit()また、 duringを呼び出してプロセスを終了しようとしましたApplication_End()。両方の方法の問題は、Application_End または Application_Start の間に到着した要求が失敗することです (手動のプロセス リサイクルとは異なり、要求はすぐに新しいプロセスにリダイレクトされるため、まったく失敗しません)。

4

2 に答える 2

0

「AppDomain のリサイクル」は ASP.NET ランタイムのプレビュー段階にあり、IIS は実際にはどこにも関与していないと思います (IIS7 の統合パイプラインの場合、これについて 100% 確信はありません)。だから私はあなたが望むものが実現可能だとは思わない。ただし、問題に対して検討できる回避策がいくつかあります。

  1. 起動コード (レガシー コードを操作する) を 1 回だけ実行するようにしてください。これは、名前付きシステムセマフォを介して可能にする必要があります。ワーカー プロセスでアプリの起動によってシステム セマフォが作成されると、プロセスがリサイクルされるまで存在するため、プロセスごとの初期化を行うことができます。

  2. #1 が不​​可能な場合は、別のプロセスでレガシ コードを操作するコードをホストすることを検討してください。このプロセスは、名前付きパイプを介して WCF サービスを介して関連する機能を公開できます。ASP.NET はそれらを消費してレガシ コードを使用します。

于 2010-09-21T13:19:26.163 に答える
0

ワーカー プロセスを再利用しないことを IIS に伝える方法が見つかりませんでした。プロセスの再利用を妨げる根本的な問題を修正する余裕がない。したがって、接続のリセットで少数の要求が失敗する可能性がありますが、最終的に を呼び出すことEnvironment.Exit(0)になりました。Application_End

于 2010-09-26T14:05:14.220 に答える