2

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

timoutは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);
    }
}

最善のアプローチ?

4

2 に答える 2

3

私はこのルートを使用しました。上記のコードとの違いは、コントローラーが非同期であるかどうかも確認することです。これは、長時間のポーリングシナリオである場合にのみ、この方法でタイムアウトを処理するためです。

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);
    }
} 
于 2012-03-08T11:22:38.480 に答える
1

最高の概念は非常に主観的です。人によって定義が違うので、話したくないです。私にとって、カスタム例外フィルターを使用することは、例外処理コードでコントローラーを汚染することなく、このケースを処理するための非常に優れたアプローチです。

于 2012-03-07T11:54:41.257 に答える