10

従来のネイティブ コードにリンクする ASP.NET MVC 4 アプリケーションがあります。問題は、このレガシ コードには起動時に構築されるグローバルな静的情報があることですが、ネイティブ コードはアプリ ドメインについて何も知らないため、アプリ ドメインがリロードされたときにそのコードが再初期化されません。これにより、アプリケーション プール プロセスが再起動されるまで、アプリで不適切な動作やクラッシュが発生します。

このため、アプリケーションのアプリ ドメインがリサイクルされるたびに、アプリケーション プールを強制的にリサイクルしたいと考えています。このための IIS の設定はありますか、またはドメインがアンロードされているときにアプリケーションで呼び出すことができるコードはありますか?

私のセットアップに関するいくつかの情報、

  1. ASP.NET MVC 4 アプリケーション
  2. IIS 7.5 ですが、必要に応じて 8 に移行できます
  3. アプリケーション プールごとに 1 つのアプリケーションが存在することを確認できるため、他のアプリケーションに影響を与えることはありません。

アップデート

以下の回答に基づいて、AppDomain のアンロード イベントに接続し、次のようなコードを使用してアプリケーション プールをリサイクルしました。

try
{
   // Find the worker process running us and from that our AppPool
   int pid = Process.GetCurrentProcess().Id;
   var manager = new ServerManager();
   WorkerProcess process = (from p in manager.WorkerProcesses where p.ProcessId == pid select p).FirstOrDefault();

   // From the name, find the AppPool and recycle it
   if ( process != null )
   {
      ApplicationPool pool = (from p in manager.ApplicationPools where p.Name == process.AppPoolName select p).FirstOrDefault();
      if ( pool != null )
      {
         log.Info( "Recycling Application Pool " + pool.Name );
         pool.Recycle();
      }
   }
}
catch ( NotImplementedException nie )
{
   log.InfoException( "Server Management functions are not implemented. We are likely running under IIS Express. Shutting down server.", nie );
   Environment.Exit( 0 );
}
4

3 に答える 3

3

より残忍なアプローチは、Process.GetCurrentProcess().Kill() を呼び出すことです。あまり優雅ではありませんが、サイトに独自のアプリ プールがあり、現在のリクエストが残忍に停止されることを気にしない場合は、非常に効果的です!

于 2013-11-07T05:58:16.437 に答える
2

あなたの投稿に基づいて、いつ再起動をトリガーするかを知っているように見えるので、ここにアプリケーション プールの再起動 (リサイクル) の投稿があり、その方法を説明しています。

于 2012-08-07T18:11:56.170 に答える