Лучший способ обработки тайм-аутов с AsyncController - PullRequest
2 голосов
/ 07 марта 2012

В моем проекте MVC3 у меня долгое время опрашивающий контроллер. Время ожидания установлено на 30 секунд. У меня есть реализация HandleErrorAttribute, которая обрабатывает протоколирование всех ошибок.

Поскольку тайм-аут выдает исключение 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);
    }
}

Лучший подход?

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

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

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 голос
/ 07 марта 2012

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

...