ASP.net MVCプロジェクトに非同期でメッセージを送信するコードがあります。特定の状況下では、コードが失敗し、手渡されない例外が発生する可能性があります。例外を投げているコードやスレッドを生成しているコードに直接アクセスすることはできないので、エラーを捕まえて処理することができません。私はGlobal.asaxのApplication_Errorレベルでキャッチしようとしましたが、その関数はページエラーだけでスローされ、バックグラウンドエラーではスローされません。また、OnUnhandledExceptionを実装してHTTPモジュールをキャッチしようとしましたが、例外をキャッチしてそこにワーカープロセスが存在しないようにする方法が見つかりませんでした。ASP.net WPがエラーで終了するのを防ぐ方法
これらのエラーが致命的であることを防ぐ手段はありますか?彼らは重大な間違いであり、対処すべきだと思っていますが、私はむしろ他のページの他のユーザーのためのワーカープロセスを終了しません。
詳しい仕様:
メッセージディスパッチャは、EventStoreであると私は、私はこのケースで持っていた問題は、それがNServiceBusの以前のバージョンからのICommandを実装し、メッセージをデシリアライズしようとしたことだったと思います。最新のベータ版に更新した後、デシリアライズに失敗したようです。残念ながら私はエラーを引き起こしていたコミットを愚かに削除しましたので、問題を完全には複製できません。
私は、エラーをシミュレートするために、これまでに見つけた最良の方法は、あなたがスナップ例外が問題を引き起こすことなく投げ、適切に処理されて気づくでしょう
public virtual ActionResult Error()
{
Task.Factory.StartNew(blowup);
return new EmptyResult();
}
private void blowup()
{
throw new Exception("snap");
}
を行うことです。しかし、あなたが待っていれば、我々が観察しなかった事実は、タスクの例外プロパティは、最終的にアプリケーション全体を殺します。
Cassiniに対してテストされていますが、IIS 7.5と同様の動作です。
これは良いメモですが、私のタスクの使用は、バックグラウンドスレッドの例外がキャッチされていないことを示す簡単な方法でした。 – stimms
私の提案は_hand_ Unhandled例外を処理します(UnhandledExceptionイベントにも加入している場合)。 – usr
ああ、大丈夫。私は今、喜んで例外を傍受してログに記録できますが、それでも依然としてワーカープロセスが停止します。私はキーが例外として設定されていることを確認しましたhttp://blogs.microsoft.co.il/blogs/bondib/archive/2011/02/08/crashes-task-parallel-library-tpl-and-the-unobservedtaskexception .aspx – stimms