asp.net-mvc - 在ASP.NET MVC中,如何重构try/catch并返回JSON错误消息?

标签 asp.net-mvc json error-handling refactoring

如何在新的ASP.NET MVC应用程序中最好地创建基本 Controller ,该应用程序将包含样板代码来处理派生 Controller 中每个 Action 的所有try/catch例程,并在登录Nlog后返回标准JSON错误消息。我还想处理404错误以重定向到自定义404 View 。我的目标是使用OWIN Cookie身份验证,并希望在Cookie过期时退出。我所有的操作都将返回JsonResult并通过jQuery Ajax调用。

在以前的项目中,我使用了以下方法:

Global.asax.cs

  protected void Application_Error(object sender, EventArgs e)
    {
        Exception lastError = Server.GetLastError();
        Server.ClearError();

        var statusCode = 0;

        statusCode = lastError.GetType() == typeof(HttpException) ? ((HttpException)lastError).GetHttpCode() : 500;

        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");
        routeData.Values.Add("statusCode", statusCode);
        routeData.Values.Add("exception", lastError);

        if (new HttpRequestWrapper(HttpContext.Current.Request).IsAjaxRequest())
        {
            routeData.Values.Add("action", "Ajax");     
        }
        else
        {
            routeData.Values.Add("action", "Index");
        }

        var requestContext = new RequestContext(new HttpContextWrapper(Context), routeData);

        IController controller = new ErrorController();
        controller.Execute(requestContext);

        Response.End();
    }

ErrorController.cs
 public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };

        Response.StatusCode = statusCode;

        return View(model);
    }

    public JsonResult Ajax(int statusCode, Exception exception, Dictionary<string,string> validationErrors = null)
    {
        var model = new ErrorModel { HttpStatusCode = statusCode, Exception = exception.Message };

        if (exception.GetType() == typeof (DbEntityValidationException))
        {
            model.ValidationErrors = null;
        }
        else
        {
            model.ValidationErrors = validationErrors;
        }

        Response.StatusCode = statusCode;

        return Json(model, JsonRequestBehavior.AllowGet);
    }
}

最佳答案

最好的方法是通过扩展HandleErrorAttribute像这样:

public class AjaxAwareHandleErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // Execute the normal exception handling routine...
        base.OnException(filterContext);            

        // Verify if AJAX request...
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            // Use Json in case of AJAX request...
            var result = new JsonResult();                
            result.Data = new { Error = filterContext.Exception.Message };

            filterContext.Result = result;
        }
    }
}

然后,您需要做的就是在FilterConfig文件夹下的App_Start类中注册该属性,如下所示:
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AjaxAwareHandleErrorAttribute());
    }
}

关于asp.net-mvc - 在ASP.NET MVC中,如何重构try/catch并返回JSON错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27236428/

相关文章:

asp.net-mvc - 在 MVC 应用程序中重新验证用户以进行操作

javascript - 用于数据存储的隐藏 html 表

swift - Swift 中的错误处理 : Error from one enum to another

asp.net - 需要方法的参数值,其中在每个方法中没有特定代码的情况下会引发异常以进行日志记录

asp.net-mvc - 在具有静态内容的网站上进行全文搜索。 Lucene.net 与 elasticsearch

jquery - 对于 ASP.NET MVC 中的所有用例,JSON 是否都比部分 View 更好?

C# 解析 JSON 字符串

json - 将变量(包含空格)传递给 curl --data 字段

python - 您可以继续在运行时错误后运行代码吗?

asp.net-mvc - @Model和@ ViewData.Model有什么区别?