2012-03-07 1 views
2

У меня есть длинный контроллер опроса в моем проекте MVC3. У этого таймаута установлен 30 секунд. У меня есть реализация HandleErrorAttribute, которая обрабатывает протоколирование всех ошибок.Лучший способ обработки тайм-аутов с AsyncController

Поскольку тайм-аут выбрасывает исключение TimeoutException, это означает, что они будут представлены в журнале.

Мне нужно перехватить эту ошибку, прежде чем мой класс HandleErrorAttribute получит ее и вернет объект json вместо страницы с ошибкой 500. Какой лучший подход для этого?

Я сделал это, и она работает

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

Понятие best очень субъективно. Я предпочитаю не говорить об этом, так как разные люди имеют другое определение. Для меня использование настраиваемого фильтра исключений - очень хороший подход для обработки этого случая, не загрязняя ваш контроллер кодом обработки исключений.