2

我有一个控制器,其中包含一系列返回 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 { } };
}

仅在此控制器/这些操作上,我想禁用重定向,以便将错误代码返回给客户端。仍然需要抛出错误,但不知何故,自定义错误模式需要更改为仅针对此请求和请求持续时间的关闭。

4

2 回答 2

3

我接受了@frennky 提供的答案并对其进行了一些扩展。我正在设置 HTTP 响应代码并让 jQuery 端的错误处理程序处理它。

就我而言,我正在与使用 ASP.NET 自定义错误页面的旧版 webforms 应用程序集成,该页面捕获了我的所有错误。所有异常都被吞下,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);
}
于 2011-11-15T21:57:44.043 回答
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
        }
    }
    //...
}
于 2011-01-24T21:30:27.930 回答