码迷,mamicode.com
首页 > Web开发 > 详细

Asp.net Core-过滤器

时间:2020-01-03 14:25:57      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:rri   ajax   tap   mil   lse   source   系统   创建   header   

11

 

 

ResourceFilter:
和ActionFilter的区别是:OnResourceExecuting在Controller创建之前调用
public class CustomerResourceFilterAttribute : Attribute, IResourceFilter
    {
        private static ConcurrentDictionary<string, object> CACHE_DICT = new ConcurrentDictionary<string, object>();
        private string _cacheKey;
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            _cacheKey = context.HttpContext.Request.Path.ToString();
            if (CACHE_DICT.TryGetValue(_cacheKey, out object result))
            {
                var actionResult = result as IActionResult;
                if (actionResult != null)
                {
                    context.Result = actionResult;
                }                
            }
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            if (!CACHE_DICT.ContainsKey(_cacheKey))
            {
                if (context.Result != null)
                {
                    CACHE_DICT.TryAdd(_cacheKey, context.Result);
              }
            }
            
        }

    }

 

 ActionFilter:

public class CustomerActionFilterAttribute : Attribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("OnActionExecuting");
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            Console.WriteLine("OnActionExecuted"); 
        }

    }

ResultFilter:

public class CustomerResultFilterAttribute : Attribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            Console.WriteLine("OnResultExecuting");
        }
        public void OnResultExecuted(ResultExecutedContext context)
        {
            Console.WriteLine("OnResultExecuted");
        }
    }

 ExceptionFilter:

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
    {
        private readonly IHostingEnvironment _hostingEnvironment;
        private readonly IModelMetadataProvider _modelMetadataProvider;

        public CustomExceptionFilterAttribute(
            IHostingEnvironment hostingEnvironment,
            IModelMetadataProvider modelMetadataProvider)
        {
            _hostingEnvironment = hostingEnvironment;
            _modelMetadataProvider = modelMetadataProvider;
        }

        public override void OnException(ExceptionContext filterContext)
        {
            if (!filterContext.ExceptionHandled)//异常有没有被处理过
            {
                string controllerName = (string)filterContext.RouteData.Values["controller"];
                string actionName = (string)filterContext.RouteData.Values["action"];

                if (this.isAjaxRequest(filterContext.HttpContext.Request))//检查请求头
                {
                    filterContext.Result = new JsonResult(
                         new AjaxResult()
                         {
                             Result = DoResult.Failed,
                             PromptMsg = "系统出现异常,请联系管理员",
                             DebugMessage = filterContext.Exception.Message
                         }//这个就是返回的结果
                    );
                }
                else
                {
                    var result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
                    result.ViewData = new ViewDataDictionary(_modelMetadataProvider, filterContext.ModelState);
                    result.ViewData.Add("Exception", filterContext.Exception);
                    filterContext.Result = result;
                }
                filterContext.ExceptionHandled = true;
            }
        }


        private bool isAjaxRequest(HttpRequest request)
        {
            string header = request.Headers["X-Requested-With"];
            return "XMLHttpRequest".Equals(header);
        }
    }

 

 

 

未完待续...

Asp.net Core-过滤器

标签:rri   ajax   tap   mil   lse   source   系统   创建   header   

原文地址:https://www.cnblogs.com/fanfan-90/p/12144471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!