2

最近、運用 Web サイトに asp.net Web API を公開しました。本番環境では、1 日に 1 回、未処理の例外により Web サイト プロセスがリサイクルされます。

未処理の例外が発生し、プロセスが終了しました。アプリケーション ID: /LM/W3SVC/2/ROOT/oasis プロセス ID: 9236 例外: System.AggregateException メッセージ: タスクの待機中またはその Exception プロパティへのアクセスによって、タスクの例外が確認されませんでした。その結果、監視されていない例外がファイナライザー スレッドによって再スローされました。StackTrace: System.Threading.Tasks.TaskExceptionHolder.Finalize() で InnerException: System.Web.HttpException メッセージ: リモート ホストが接続を閉じました。エラー コードは 0x800704CD です。StackTrace: System.Web.Http.WebHost.HttpControllerHandler.EndProcessRequest(IAsyncResult 結果) で System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() で System.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ、ブール値&

この例外は、プログラム コードではなく、Web API 内部で発生しているようです。これにより多数のユーザーのセッションが破壊されるため、このような例外がプロセスをリサイクルするのを防ぐ必要があります。

この例外を処理する1つの方法は、次を使用することであることを理解しています:

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    McpsEventLog.PostException(e.Exception, "webapicontroller");
    e.SetObserved();
};

しかし、これが機能するためには、このコードをどこに置くことができますか? Web APIコントローラーのどこかに?または、global.asax で。UnobserveredTaskException を asp.net Web Api レスト サービスに実装する方法を知っている人はいますか?

4

1 に答える 1

4

その通りです。未処理の例外は、Web アプリケーションのコンテキストでは受け入れられません。そのハンドラーを設定する適切な場所はApplication_Startイベントです。

UnhandledException-eventも設定する必要があります。ただし、例外を飲み込むことはできません。記録するだけです。

最後に、このトピックに関する私の質問を参照してください: ASP.NET で未処理のスレッド例外を処理する方法は? 有用な答えは得られませんでしたが、それでも役立つかもしれません。

于 2012-08-29T11:50:44.717 に答える