ASP.NET MVC 2.0 - 禁用控制器/操作的自定义错误重定向

时间:2011-01-24 17:39:51

标签: asp.net-mvc ajax asp.net-mvc-2 redirect custom-errors

我有一个控制器,其中包含一系列返回jsonp的操作。我的问题是,在启用自定义错误的情况下,当存在硬件服务器错误时,我的jquery 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 个答案:

答案 0 :(得分:3)

我接受了@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;
        }
    }
}

这是我在jQuery AJAX请求失败时调用的Javascript函数(本例简化):

function HandleAjaxError(jqXHR, textStatus, errorThrown) {
    alert(jqXHR.statusText);
}

答案 1 :(得分:1)

如果这些是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
        }
    }
    //...
}