ASP.NET MVC 2.0 - отключить пользовательское перенаправление ошибок для контроллера / действия - PullRequest
2 голосов
/ 24 января 2011

У меня есть контроллер с рядом действий, которые возвращают jsonp.Моя проблема заключается в том, что с включенными пользовательскими ошибками мои jjery ajax-вызовы не «ошибаются» при серьезной ошибке сервера.Итак, мне нужно отключить пользовательское перенаправление ошибок только для контроллера или, если нужно, для каждого действия в этом контроллере.

Можно ли как-то отключить перенаправление, когда ошибка происходит только на техдействия, но все еще возвращают код ошибки клиенту, чтобы ajax мог обработать ошибку?

РЕДАКТИРОВАТЬ:

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

<customErrors mode="RemoteOnly" defaultRedirect="~/Error/ServerError">
  <error statusCode="403" redirect="~/Error/AccessDenied" />
  <error statusCode="404" redirect="~/Error/NotFound" />
  <error statusCode="500" redirect="~/Error/ServerError" />
  <error statusCode="999" redirect="~/Error/ServerError" />
</customErrors>

Затем у меня есть свой собственный атрибут сообщения об исключениях.Этот атрибут применяется к базовому классу контроллера, который реализует IController.Все мои контроллеры наследуются от этого базового контроллера, так что все они имеют отчеты об ошибках, встроенные в любое время при возникновении ошибки сервера.

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        base.OnException(context);
        RaiseErrorSignal(context.Exception);
    }

    private static void RaiseErrorSignal(Exception ex)
    {
        IExceptionHandler handler = Resolve();

        handler.HandleError(ex.GetBaseException());
    }

    private static IExceptionHandler Resolve()
    {
        return ServiceLocator.Locate<IExceptionHandler>();

    }
}

И у меня есть контроллер с такими методами

public JsonpResult DoSomething(string sessionId /*...more params...*/)
{
    //Do work

    return new JsonpResult() { Data = new { } };
}

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

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Я взял ответ, предоставленный @frennky, и немного расширил его.Я устанавливаю код ответа HTTP и позволяю обработчику ошибок на стороне jQuery его обрабатывать.

В моем случае я интегрируюсь с устаревшим приложением webforms, которое использует настраиваемую страницу ошибок ASP.NET, которая захватила все моиошибки.Все исключения были проглочены, и вызов jQuery AJAX, по-видимому, завершился нормально.HTML-код пользовательской страницы ошибок возвращался в мою функцию успеха JQuery AJAX.Мне нужен был способ использовать обработку ошибок, предоставляемую jQuery.Этот подход решает эту задачу.

Вот мой пользовательский атрибут HandleErrorAttribute:

public class HandleAjaxErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            base.OnException(filterContext);
            return;
        }
        else
        {
            //Log the error here.
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
            filterContext.HttpContext.Response.StatusDescription = filterContext.Exception.Message;
        }
    }
}

Вот моя функция Javascript, которая вызывается при сбое запроса JQuery AJAX (упрощенно для этого примера):

function HandleAjaxError(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.statusText);
}
1 голос
/ 25 января 2011

Если это Ajax-вызовы, вы можете попробовать что-то вроде этого:

public sealed class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        if (!filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            base.OnException(context);
            RaiseErrorSignal(context.Exception);
        }
        else
        {
            //Respond to ajax call with error message
        }
    }
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...