Asp.net mvc 2 MVC2.0-自定义处理所有错误以返回json

Asp.net mvc 2 MVC2.0-自定义处理所有错误以返回json,asp.net-mvc-2,exception-handling,custom-errors,Asp.net Mvc 2,Exception Handling,Custom Errors,我有一个MVC2应用程序,我希望所有请求都返回json。我已经重写了一个HandleErrorAttribute和一个authorized属性。我的目标是将所有错误(甚至403和404)作为json返回 这是我的错误处理程序ExceptionModel是一个简单的类,用于定义应用程序返回的任何错误。异常处理程序是一个将错误详细信息转换为格式化电子邮件并发送给我的类 public class HandleErrorJsonAttribute : System.Web.Mvc.HandleError

我有一个MVC2应用程序,我希望所有请求都返回json。我已经重写了一个
HandleErrorAttribute
和一个
authorized属性
。我的目标是将所有错误(甚至403和404)作为json返回

这是我的错误处理程序
ExceptionModel
是一个简单的类,用于定义应用程序返回的任何错误。异常处理程序是一个将错误详细信息转换为格式化电子邮件并发送给我的类

public class HandleErrorJsonAttribute : System.Web.Mvc.HandleErrorAttribute
{
    public override void OnException(ExceptionContext context)
    {
        context.ExceptionHandled = true;

        RaiseErrorSignal(context.Exception);

        context.RequestContext.HttpContext.Response.ContentType = "application/json";

        JsonSerializer serializer = new JsonSerializer();
        serializer.Serialize(context.HttpContext.Response.Output, new ExceptionModel(context.Exception));
    }

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

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

    private static IExceptionHandler Resolve()
    {
        return ServiceLocator.Locate<IExceptionHandler>();
    }
}
最后,我的自定义授权属性。我使用forms auth,但我不想要任何自动重定向。我只是希望错误显示在屏幕上,并停止任何进一步的处理

public class AuthorizeTokenAttribute : System.Web.Mvc.AuthorizeAttribute
{
    public bool SuperAdminOnly { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorized = base.AuthorizeCore(httpContext);

        if(!SuperAdminOnly)
            return authorized;

        if(!authorized)
            return authorized;

        return SessionHelper.UserIsSuperAdmin(httpContext.User.Identity.Name);
    }

    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        throw new HttpException(403, "Access Denied");
    }
}
这一切对于大多数错误都非常有效,但它缺少一件事。我有一个这样的控制器动作

[AuthorizeToken]
[HttpPost]
public JsonResult MyAction()
{
    return new JsonResult();
}
当您通过post提交时,它工作正常,但在get上,我收到一个未处理的404错误

“/”应用程序中出现服务器错误

找不到资源

描述:HTTP404。资源 您正在寻找(或其中一个) 依赖项)可以被删除, 它的名字改变了,或者 暂时不可用。请 查看以下URL并确保 它拼写正确

请求的URL:/MyController/MyAction

版本信息:Microsoft.NET 框架版本:4.0.30319;ASP.NET 版本:4.0.30319.1

这发生在GET上,这是预期的默认行为。但是,我如何处理这个条件,以便可以像这样返回json

{"ErrorCode":404,"Message":"Page Not Found"}

要亲自处理错误,我更喜欢Global.asax中的
应用程序错误
事件:

protected void Application_Error(object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    Response.Clear();
    Server.ClearError();

    var httpException = exception as HttpException;
    var routeData = new RouteData();
    routeData.Values["controller"] = "Errors";
    routeData.Values["action"] = "Index";
    routeData.Values["error"] = exception;

    IController errorController = new ErrorsController();
    errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
然后有一个错误控制器:

public class ErrorsController : Controller
{
    public ActionResult Index(Exception exception)
    {
        var errorCode = 500;
        var httpException = exception as HttpException;
        if (httpException != null)
        {
            errorCode = httpException.ErrorCode;
        }

        return Json(new
        {
            ErrorCode = errorCode,
            Message = exception.Message
        }, JsonRequestBehavior.AllowGet);
    }
}
public class ErrorsController : Controller
{
    public ActionResult Index(Exception exception)
    {
        var errorCode = 500;
        var httpException = exception as HttpException;
        if (httpException != null)
        {
            errorCode = httpException.ErrorCode;
        }

        return Json(new
        {
            ErrorCode = errorCode,
            Message = exception.Message
        }, JsonRequestBehavior.AllowGet);
    }
}