.net 过滤器

136 阅读2分钟

起始

创建过滤器

using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication3.Utility.Filter
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {
        /// <summary>
        /// 在xx资源之后
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("OnResourceExecuted");
        }

        /// <summary>
        /// 在xx资源之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("OnResourceExecuting");
        }
    }
}

使用过滤器

using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;

namespace WebApplication3.Controllers
{
    public class ThirdController : Controller
    {
        [CustomResourceFilter]
        public IActionResult Index()
        {
            return View();
        }
    }
}

image.png

缓存数据_AsgncResourceFilter

修改过滤器

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication3.Utility.Filter
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {



        private static Dictionary<string,object> CacheDictionary = new Dictionary<string,object>();

        /// <summary>
        /// 在xx资源之后
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            string key = context.HttpContext.Request.Path;
            CacheDictionary[key] = context.Result;



            Console.WriteLine("OnResourceExecuted");
        }

        /// <summary>
        /// 在xx资源之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // 请求的路径
            string key = context.HttpContext.Request.Path;
            if (CacheDictionary.ContainsKey(key))
            {
                // 只要是给Result赋值,就会中断往后执行,直接返回给调用方
                context.Result = (IActionResult)CacheDictionary[key];
            }
            Console.WriteLine("OnResourceExecuting");
        }
    }
}

修改Controller

using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;

namespace WebApplication3.Controllers
{
    public class ThirdController : Controller
    {
        [CustomResourceFilter]
        public IActionResult Index()
        {
            // 定义一个缓存的区域
            // 判断是否有缓存
            // 如果没有缓存,则计算
            // 计算结果保存到缓存中
            ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
            return View();
        }
    }
}

对应视图


@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>
<h3>
    来自于控制器的计算结果:@ViewBag.Date
</h3>

<h3>
    来自于实际计算的结果:@DateTime.Now.ToString("yyyy-MM-dd ss");
</h3>

效果演示

第一次进入

image.png

第二次进入

image.png

第三次进入

image.png

异步缓存_AsgncResourceFilter

修改过滤器

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication3.Utility.Filter
{

    public class CustomAsyncResourceFilter : Attribute, IAsyncResourceFilter
    {

        private static Dictionary<string, object> CacheDictionary = new Dictionary<string, object>();
        /// <summary>
        /// 当xxx资源执行的时候
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            Console.WriteLine("before");
            String key = context.HttpContext.Request.Path;
            if (CacheDictionary.ContainsKey(key))
            {
                // 只要是给Result赋值,就会中断往后执行,直接返回给调用方
                context.Result = (IActionResult)CacheDictionary[key];
            }
            else
            {
                // 执行控制器的构造函数
                ResourceExecutedContext resource = await next.Invoke();

                CacheDictionary[key] = resource.Result;
            }

            Console.WriteLine("after");
        }
    }
}

修改controller

using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;

namespace WebApplication3.Controllers
{
    public class ThirdController : Controller
    {
        [CustomResourceFilter]
        public IActionResult Index()
        {
            // 定义一个缓存的区域
            // 判断是否有缓存
            // 如果没有缓存,则计算
            // 计算结果保存到缓存中
            ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");

            return View();
        }


        [CustomAsyncResourceFilter]
        public IActionResult Index1()
        {
            // 支持缓存
            Console.WriteLine("index1 here");
            ViewBag.Date = DateTime.Now.ToString("yyyy-MM-dd ss");
            return View();
        }
    }
}

image.png

日志记录_ActionFilter

特点

更靠近action,记录的就是Action执行前最后真实的参数和结果

配置filter

using Microsoft.AspNetCore.Mvc.Filters;

namespace WebApplication3.Utility.Filter
{
    public class LogActionFilter : Attribute, IActionFilter
    {

        private readonly ILogger<LogActionFilter> logger;
        public LogActionFilter(ILogger<LogActionFilter> logger)
        {
            this.logger = logger;
        }

        /// <summary>
        /// 在xxx执行之后
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnActionExecuted(ActionExecutedContext context)
        {
            Console.WriteLine("after");
            var result = Newtonsoft.Json.JsonConvert.SerializeObject(context.Result);
            var name1 = context.HttpContext.GetRouteValue("controller");
            var name2 = context.HttpContext.GetRouteValue("action");

            logger.LogInformation($"执行:{name1},控制器:{name2},参数:{result}");

        }

        /// <summary>
        /// 在xxx执行之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("before");

            var para = context.HttpContext.Request.QueryString.Value;
            var name1 = context.HttpContext.GetRouteValue("controller");
            var name2 = context.HttpContext.GetRouteValue("action");

            logger.LogInformation($"执行:{name1},控制器:{name2},参数:{para}");

        }
    }
}

配置controller

using Microsoft.AspNetCore.Mvc;
using WebApplication3.Utility.Filter;

namespace WebApplication3.Controllers
{
    public class ThirdController : Controller
    {
       
        [TypeFilter(typeof(LogActionFilter))]
        public IActionResult Index2(int id)
        {
            ViewBag.user = Newtonsoft.Json.JsonConvert.SerializeObject(new { 
               id = id,
               name = " zhansan",
               age = 66
            });

            ViewData["userinfo"] = Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                id = id,
                name = " lisi",
                age = 88
            });

            // 支持缓存
            Console.WriteLine("index2 here");
            return View();
        }
    }
}


日志展示

image.png