0

Windows 7、IIS 7.5.7600.16385 を使用しており、現在 .NET 4.6.1 がインストールされており、MVC アプリケーションがあります。

数日前、アプリケーションで奇妙な動作が発生しました。残念ながら、Application_Start 内で呼び出されるサービスは利用できず、未処理の例外が内部でスローされました。私の予想される動作は、 Application_Start() が次のリクエストで再度呼び出されるか、次のリクエストが Application_BeginRequest() で直接開始されることでした。.

残念ながら、次の結果が得られます。

Application_Start() 内で例外が発生した場合、最初のリクエストでエラー 500 が発生します。それで大丈夫です。

この後、他のすべてのリクエストは、最初のリクエストでスローされる例外を返します。ローカル環境でタイムスタンプを使用して例外をスローすることで確認しました。各応答には、最初の要求からのタイムスタンプを含む例外が含まれており、HTTP 応答は依然として 500 です。どの URL が呼び出されるかに依存しません。私たちのコードではブレークポイントはヒットしませんが、IIS ログにはリクエストが表示されます。答えはどこかにキャッシュされているようです。

アプリケーションは未定義の初期化ステータスのリクエストに応答しないため、個人的にはこの動作が気に入っています。

そして、はい、Application_Start() 内で他のサービス リソースを呼び出すことは最善のアイデアではないことを知っており、おそらく次回は削除します :)

私の質問:

  • Application_Start() で例外がスローされた場合の動作を構成することは可能ですか?

  • この動作がいつ変更されたか、またはすでに長い間存在していることを誰かが知っているのでしょうか?

4

2 に答える 2

0

今日は、もう一度動作を確認する時間がありました。いくつかのリリースで Serilog を導入しましたが、構成が再起動の動作に影響を与えているようです。

protected void Application_Start()  
{  
  SerilogManager.Configure(); //own class  
  using (LogContext.PushProperty(SerilogManager.PROPERTY_NAME_ComponentName, "xxx")){}    
  throw new Exception(DateTime.Now.ToString("hh:mm:ss"));  
}  

Application_Start から PushProperty 行を削除すると、再起動は問題なく機能します。この行では Application_End は呼び出されません。

これで、個人用およびビジネス用のコンピューターで再現できます。前回、デモ アプリケーションがビジネス マシンで Application_end を呼び出さなかった理由がわかりません。

于 2016-03-18T15:55:28.950 に答える
0

さて、私はこのシナリオを分析し、多くのサイトを検索しましたが、それに関する情報は見つかりませんでした. しかし、私はそのような振る舞いを観察することができました:

  • Application_Start 内で未処理のエラーがスローされると、IIS がエラー ページを返し、Web アプリがシャットダウンを開始します。
  • シャットダウン中 (私の場合は 10 秒)、新しい要求は IIS によって処理され、応答は最初の要求と同じです。IIS は Web サイトがシャットダウンされていることを認識しているため、最後のエラーが原因であることは明らかです。
  • しばらくすると、アプリケーションは Application_End イベントを発生させ、シャットダウンが完了したことを知らせます。そのイベントの後、Web サイトへの次のリクエストで Application_Start が再度発生し、新しいレスポンスが生成されます。

アプリケーションが再起動するのに時間がかかるだけなので、この動作を変更できるとは思いません。

于 2016-03-17T11:37:51.680 に答える