2012-02-23 11 views
2

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と同様の動作です。

答えて

1

問題は、未処理の例外が原因でプロセスが中断することです。この問題は、ASP.NETとは何の関係もありません。

すべての例外をキャッチする(およびあなたと電子メールを送信する)観測されていないイベントのイベント(http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.unobservedtaskexception.aspx)をフックアップします。

このイベントとApplication_Errorイベントに加えてThread.UnhandledExceptionイベントをフックするのがベストプラクティスであると考えます。

+0

これは良いメモですが、私のタスクの使用は、バックグラウンドスレッドの例外がキャッチされていないことを示す簡単な方法でした。 – stimms

+0

私の提案は_hand_ Unhandled例外を処理します(UnhandledExceptionイベントにも加入している場合)。 – usr

+2

ああ、大丈夫。私は今、喜んで例外を傍受してログに記録できますが、それでも依然としてワーカープロセスが停止します。私はキーが例外として設定されていることを確認しましたhttp://blogs.microsoft.co.il/blogs/bondib/archive/2011/02/08/crashes-task-parallel-library-tpl-and-the-unobservedtaskexception .aspx – stimms

1

.NET 1.1には、すべての未処理の例外のバックストップがありました。それを静かに捕まえて、楽しい方法で進んでいくでしょう。

.NET 2.0では、Microsoftはこれを次のように変更しました。未処理の例外があればプロセスは停止しますが、Application_Errorメソッドの "Handler Soup" .UnhandledExceptionイベント、および.NET 4.0では、TaskScheduler.UnobservedTaskExceptionが発生します。

マイクロソフトでは、.NET 1.1の動作を復元するための設定値を提供しています。エラーが発生したWebアプリケーションでは、プロセス内の貴重なキャッシュアイテムを破棄してプロセス全体をリサイクルできます。 <runtime>セクションで

<legacyUnhandledExceptionPolicy enabled="1"/> 

Microsoftの記事Exceptions in Managed Threadsは、より詳細にこのすべてを説明しています。

+0

これは良い解決策ではありません。これらのエラーを無視するだけで、誰にも役立つことはありません。機能が2.0で変更された理由がありました – stimms

+0

もちろんログ、トリアージ、修正が必要です。問題は、Webアプリケーションを終了させないようにする方法でした。 –

関連する問題