Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在ASP.NET MVC中,如何重构try/catch并返回JSON错误消息?_Asp.net Mvc_Json_Error Handling_Refactoring - Fatal编程技术网

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

Asp.net mvc 在ASP.NET MVC中,如何重构try/catch并返回JSON错误消息?,asp.net-mvc,json,error-handling,refactoring,Asp.net Mvc,Json,Error Handling,Refactoring,如何最好地在新的ASP.NET MVC应用程序中创建基本控制器,该应用程序将包含样板代码,以处理派生控制器中每个操作的所有try/catch例程,并在登录到Nlog后返回标准JSON错误消息。我还想处理404错误以重定向到自定义404视图。我的目标是使用OWIN cookie身份验证,并希望在cookie过期时注销。我的所有操作都将返回JsonResult并通过jQueryAjax调用 在以前的项目中,我使用了以下方法: 在Global.asax.cs中 protected void App

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

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

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();
    }
 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);
    }
}
ErrorController.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();
    }
 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);
    }
}
公共类错误控制器:控制器
{
公共操作结果索引(int状态代码、异常)
{
var model=newerrormodel{HttpStatusCode=statusCode,Exception=Exception.Message};
Response.StatusCode=状态码;
返回视图(模型);
}
公共JsonResult Ajax(int状态码、异常、字典验证错误=null)
{
var model=newerrormodel{HttpStatusCode=statusCode,Exception=Exception.Message};
if(exception.GetType()==typeof(DbEntityValidationException))
{
model.ValidationErrors=null;
}
其他的
{
model.ValidationErrors=ValidationErrors;
}
Response.StatusCode=状态码;
返回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;
        }
    }
}
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AjaxAwareHandleErrorAttribute());
    }
}
然后,您只需在
App\u Start
文件夹下的
FilterConfig
类中注册该属性,如下所示:

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;
        }
    }
}
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AjaxAwareHandleErrorAttribute());
    }
}