2012-03-07 16 views
2

MVC3プロジェクトに長時間ポーリングコントローラがあります。タイムアウトは30秒に設定されています。すべてのエラーのロギングを処理するHandleErrorAttribute実装があります。AsyncControllerでタイムアウトを処理する最良の方法

タイムアウトはTimeoutExceptionをスローするため、ログにこれらが表示されることを意味します。

HandleErrorAttributeクラスがそれを取得して500エラーページの代わりにjsonオブジェクトを返す前に、このエラーを傍受する必要があります。これに最適なアプローチは何ですか?

私はこれをしなかったし、それが

public class HandleTimeout : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if(filterContext.Exception is TimeoutException) 
     { 
      filterContext.Result = new { Timeout = true }.AsJson(); 
      filterContext.ExceptionHandled = true; 
      filterContext.HttpContext.Response.StatusCode = 200; 
     } 

     base.OnException(filterContext); 
    } 
} 

ベストなアプローチを動作しますか?

+0

これを機能させることはできません。 シンボル "AsJson"を解決できません。あなたはその方法をどこで見つけましたか?私はC#4.5を使用しています – Nick

+0

ああ、そのヘルパーメソッドは、ちょうどJsonResultを吐き出す – Anders

答えて

3

私は上記のコードとの違いは、コントローラがAsyncであるかどうかを確認することです。なぜなら、私たちが長い時間ポーリングシナリオであればこのような方法でタイムアウトを処理したいからです。

public class HandleTimeout : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if(filterContext.Exception is TimeoutException && filterContext.Controller is AsyncController) 
     { 
      filterContext.HttpContext.Response.StatusCode = 200; 
      filterContext.Result = new { Timeout = true }.AsJson(); 
      filterContext.ExceptionHandled = true; 
     } 

     base.OnException(filterContext); 
    } 
} 
1

という概念の中でも最も良いものはです。私は別の人々がそれの異なる定義を持っているので、それについて話をしたくない。カスタム例外フィルタを使用している私にとっては、例外処理コードでコントローラを汚染することなくこのケースを処理するための非常に良いアプローチです。

関連する問題