Asp.net mvc 笔记

发布时间 2023-08-23 17:18:17作者: 试试手气

捕捉处理全局异常

自定义一个Attribute继承默认的HandleErrorAttribute

namespace EmpowerApiService.Filter
{
    public class CustomerErrorAttribute : HandleErrorAttribute
    {
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();

        public override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled) { return; }


            var controllerName = (string)filterContext.RouteData.Values["controller"];
            var actionName = (string)filterContext.RouteData.Values["action"];
            var error = new { 
                message = filterContext.Exception.Message,
                hresult = filterContext.Exception.HResult.ToString("X")
            } ;

            if (filterContext.HttpContext != null && filterContext.HttpContext.Request != null)
            {
                var requestUrl = filterContext.HttpContext.Request.Url.ToString();
                var requestParams = filterContext.HttpContext.Request.Params;
                var requestParamsStr = HttpUtility.UrlDecode(requestParams.ToString());

                // 
                logger.Error(
                    filterContext.Exception,
                    "url: {0}, params: {1}",
                    new Object[] {requestUrl, requestParamsStr });
            }

            filterContext.ExceptionHandled = true;

            // request side error
            if (filterContext.Exception is ArgumentException)
            {
                filterContext.HttpContext.Response.StatusCode = 400;
            }
            // server side error
            else
            {
                filterContext.HttpContext.Response.StatusCode = 500;
            }
            // build http response
            filterContext.Result = new JsonResult() { ContentType = "applicaltion/json", ContentEncoding = System.Text.Encoding.UTF8, Data = error, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
        }
    }
}

注册自定义的处理类,使之生效,替换默认的错误处理,修改APP_Start中的FilterConfig.cs

namespace EmpowerApiService
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            filters.Add(new EmpowerApiService.Filter.CustomerErrorAttribute());
        }
    }
}

在需要使用错误处理的ControllerAction上使用特性,就可以捕捉并处理异常

using EmpowerApiService.Filter;

namespace EmpowerApiService.Controllers{

   [CustomerError]
   public class xxxController : Controller{ ... }
}