使用 HandleError 属性 Class 处理 Http 和 Ajax 请求的错误

Handle Errors for Http and Ajax requests using HandleError Attribute Class

我正在使用我为 http 和 ajax 修改的 HandleError 属性 处理控制器中的所有错误请求,并将它们作为 500 错误类型处理。

public class HandleExceptionsAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled)
            return;
        else
        {
            ErrorLogger.LogException(filterContext);

            if (filterContext.HttpContext.Request.IsAjaxRequest() && filterContext.Exception != null)
            {
                filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

                filterContext.Result = new JsonResult
                {
                    Data = new
                    {
                        success = false,
                        message = "error",
                    },
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
            else
            {
                base.OnException(filterContext);
            }

            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
        }
    }
}

并在每个控制器上使用它作为:

[HandleExceptions]
public class InvoiceController : Controller
{}

我还在 web.config 中的 customErrors 模式为:

<customErrors mode="On" >
  <error statusCode="400" redirect="Home/Error400" />
  <error statusCode="401" redirect="Home/Error401" />
  <error statusCode="403" redirect="Home/Error403" />
  <error statusCode="500" redirect="/Home/Error" />
</customErrors>

httpErrors 为:

<httpErrors errorMode="Custom" existingResponse="Replace">
  <!--<remove statusCode="404" subStatusCode="-1" />-->
  <error statusCode="404" path="/Home/Error404" responseMode="ExecuteURL"/>
  <!--<remove statusCode="500" subStatusCode="-1" />-->
  <error statusCode="500" path="/Home/Error" responseMode="ExecuteURL"/>
</httpErrors>

我的问题是,当我只是取消注释状态代码的删除标签时,它可以很好地处理 httpErrors 但不适用于 ajax 请求,因为它没有 returning 状态代码 return 是 Home/Error 页面。 但是如果我评论这个标签然后在大多数情况下 httpErrors 不是 return 错误页面但是对于我可以在 statusCode.

中获得的 ajax 请求工作正常
$.ajax({
            url: "@Url.Action("SomeAction", "SomeController")",
            type: "POST",
            async: true,
            cache: false,
            data: JSON.stringify(data),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                if (response.success) {
                    catchSuccess("Success", response.responseText);
                }
                else {
                    catchWarning("Error", response.responseText);
                }
            },
            Error: function (ex) {
                catchError("Unkown Error", "Contact the Administrator");
            },
            statusCode: {
                500: function () {
                    catchError("Error 500", "Internal Server Error. Contact the Administrator");
                },
                403: function () {
                    catchError("Error 403", "Internal Server Error. Contact the Administrator");
                },
                404: function (response) {
                    catchError("Error 404", "Internal Server Error. Contact the Administrator");
                }
            }
        });

我应该怎么做才能捕捉到双方的错误? Ajax请求错误:我要return状态码 Http 请求错误:我想 return 从操作页面。 (Home/Error).

由于它正在运行,我将发布解决方案作为答案。 对于上述问题,而不是检查 Jquery AJAX 中的状态码检查错误。 同样的语法是

error:Function( jqXHR jqXHR, String textStatus, String errorThrown ).

尝试将输出记录到控制台或警报以检查要处理的所需结果。

如果您想处理特定响应,则抛出特定错误而不是一般错误。