菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
153
0

.NET Core 管道过滤器扩展

原创
05/13 14:22
阅读数 24936
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

验证是否为开发环境     是就正常报错   否则跳转到错误页

 

app.UseStaticFiles();

验证当前请求是否存在物理物件   存在直接返回   不走MVC路由

 

以前的管道模型  根据请求传递的控制器 方法  先实例化控制器  然后在invoke    在invoke中 执行管道中的20来个事件

在.NET Core中  先进入授权验证等一系列操作   成功在实例化控制器等后续操作

 

 

 

 

 

扩展过滤器    

    都需要继承Attribute     接口可以选择继承IActionFilter  IResourceFilter  IResultFilter 

  继承IActionFilters的过滤器在管道中的Action Filters环节触发 

  继承IResultFilter 的过滤器在管道中的IResultFilter 环节触发(自己在application层写的执行完毕后触发)

  继承ResourceFilters的过滤器其在管道的ResourceFilters环节触发   (适合做一些短路  比如缓存  这里存在就直接返回 )

 

三种过滤器执行的前后顺序  ResourceFilters入→IActionFilters入→IActionFilters出→IResultFilter入→IResultFilter出→ResourceFilters出

只有ResourceFilters在数据模型绑定之前   其他的都在数据模型绑定之后    异常处理过滤需要在进入数据模型绑定才出发

 

这些过滤器的 context.Result就是返回的数据    进入下一环节之前  会进行验证context.Result中的数据是否为null   如果不为null  就直接返回了    

 

 局部过来:在方法上直接直接加上过滤器  

 全局过滤: 往容器中添加过滤器

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            // MVC
            services.AddMvc(
                options =>
                {
                    options.Filters.Add(new CorsAuthorizationFilterFactory(_defaultCorsPolicyName));
                    options.Filters.Add(typeof(CustomActionFilterAttribute));
                }
            );

 

 依赖注入也是在IServiceCollection中实现的

 

1. 继承IActionFilter过滤器     

    public class CustomActionFilterAttribute: Attribute, IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            Console.WriteLine("ActionFilter 之前!");
            //logger.Info("ActionFilter Executing!");
        }
        public void OnActionExecuted(ActionExecutedContext context)
        {
            Console.WriteLine("ActionFilter 之后!");
            //logger.Info("ActionFilter Executed!");
        }
    }

 2.继承ResourceFilters过滤器

    public class CustomResourceFilterAttribute : Attribute, IResourceFilter
    {
        private static readonly Dictionary<string, object> _Cache = new Dictionary<string, object>();
        private string _cacheKey;

        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            _cacheKey = context.HttpContext.Request.Path.ToString();
            if (_Cache.ContainsKey(_cacheKey))
            {
                var cachedValue = _Cache[_cacheKey] as ViewResult;
                if (cachedValue != null)
                {
                    context.Result = cachedValue;
                }
            }
        }

        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            if (!String.IsNullOrEmpty(_cacheKey) &&
                !_Cache.ContainsKey(_cacheKey))
            {
                var result = context.Result as ViewResult;
                if (result != null)
                {
                    _Cache.Add(_cacheKey, result);
                }
            }
        }
    }

 ********************************

扩展中间件  Middleware   Map适合做一些分发    根据请求条件指定中间件

app.Map("/Jcb",MapTest)    请求到这里就不会继续往后面执行

app.MapWhen()   跟上面的一样  更加灵活  但是都没有回头路  当前中间件就直接结束并返回

 

UseWhen()  执行里面的后还继续往后面执行中间件

 

发表评论

0/200
153 点赞
0 评论
收藏