zoukankan      html  css  js  c++  java
  • .NET Core 管道过滤器扩展

                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()  执行里面的后还继续往后面执行中间件

  • 相关阅读:
    [程序员代码面试指南]栈和队列-单调栈结构(单调栈)
    快学Scala第一部分
    Add Digits
    Nim Game
    将分布式中多台节点的日志信息集中到一个节点上
    Eclipse调试的一些小技巧
    Maven的常用命令
    Eclipse插件本地扩展安装
    Spark应用程序的运行框架
    Spark运行各个时间段的解释
  • 原文地址:https://www.cnblogs.com/jiangchengbiao/p/10270505.html
Copyright © 2011-2022 走看看