新文章 网摘 文章 随笔 日记

自定义Web API过滤器

    /// <summary>
    /// WebApi的异常过滤器
    /// </summary>
    public class ExFilterAttribute : ExceptionFilterAttribute
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="actionExecutedContext"></param>
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Exception != null)
            {
                var ex = actionExecutedContext.Exception;

                //获取ex的第一级内部异常
                Exception innerEx = ex.InnerException ?? ex;
                //循环获取内部异常直到获取详细异常信息为止
                while (innerEx.InnerException != null)
                {
                    innerEx = innerEx.InnerException;
                }
                //NLogLogger nlog = new NLogLogger();
                var err = LogUtility.GetExceptionDetails(innerEx);

                var logger = new DbSfcLogger(new SysApplogSfcRepository(new SfcUnitOfWork(DependencyRegistrar.CreateSfcSugarClient())));

                logger.Error(err, innerEx);

                actionExecutedContext.Response = new HttpResponseMessage
                {
                    Content = new ObjectContent(typeof(ApiResult),
                        new ApiResult
                        {
                            Data = null,
                            Status = ResultStatus.Error,
                            Message = err,
                            ModelStateErrList = null
                        },
                        new JsonMediaTypeFormatter())
                };
            }
        }
    }

 

    /// <summary>
    /// 
    /// </summary>
    public class FilterConfig
    {
        /// <summary>
        /// 注册MVC过滤器
        /// </summary>
        /// <param name="filters"></param>
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
        /// <summary>
        /// 注册API过滤器
        /// </summary>
        /// <param name="filters"></param>
        public static void RegisterHttpFilters(HttpFilterCollection filters)
        {
            filters.Add(new ExFilterAttribute());
        }
    }

 

    /// <summary>
    /// 
    /// </summary>
    public class WebApiApplication : System.Web.HttpApplication
    {
        /// <summary>
        /// 
        /// </summary>
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);

            //注册MVC过滤器
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            //注册API过滤器
            FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters);

            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            GlobalConfig.PhysicalWebRootPath = Server.MapPath("~/");
            GlobalConfig.ApplicationCodeBase = Assembly.GetExecutingAssembly().CodeBase;


            ContainerManager.Container = ContainerManager.InitContainer();
        }
    }

 

给定的筛选器实例必须实现以下一个或多个筛选器接口:IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。 (microsoft.com)

 

posted @ 2022-12-22 10:56  岭南春  阅读(62)  评论(0)    收藏  举报