欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net core 拦截器的使用

程序员文章站 2022-05-29 09:30:51
.net core 拦截器的使用 实例代码:https://gitee.com/D_C_L/InterceptorTest.git 拦截器主要是将程序中的一些可以独立出去的模块进行拦截,比如幕等性,和身份认证服务等等,你想独立出去的东西,ActionFilterAttribute请求拦截器他里面几个 ......

.net core 拦截器的使用

实例代码:https://gitee.com/d_c_l/interceptortest.git

 

拦截器主要是将程序中的一些可以独立出去的模块进行拦截,比如幕等性,和身份认证服务等等,你想独立出去的东西,actionfilterattribute请求拦截器他里面几个方法,我们将一下的几个方法进行重写。

1,onactionexecuting:在执行请求开始之前进行调用

2,onactionexecuted:在执行请求开始之后进行调用

3,onresultexecuting:在执行请求结束前进行调用

4,onresultexecuted:在执行请求结束后进行调用

列如:

        /// <summary>
         /// 在执行请求开始之前进行调用
        /// </summary>
        /// <param name="context">执行的上下文</param>
        public override void onactionexecuting(actionexecutingcontext context)
        {
            context.httpcontext.response.writeasync("在控制器执行之前调用");
        }

里面可以编写你的代码,actionexecutingcontext 是请求进来的 上下文。

.net core 拦截器的使用

 

这个是里面的一些属性,你可以进行相对应的使用。、

异常拦截器的使用

iexceptionfilter实现这个接口,在startup类里面添加 app.useexceptionhandler("/home/error");也可以调到错误页面去。或者想下面重写

/// <summary>
        /// 当然是发生异常时被调用了
        /// </summary>
        /// <param name="context">执行的上下文</param>
        public void onexception(exceptioncontext context)
        {
            context.httpcontext.response.writeasync("当然是发生异常时被调用了");
            context.exceptionhandled = true;//异常已经处理,不要再次处理了
        }

全局拦截

如果说你要拦截你程序的所有请求,可以将拦截器配置到全局里面在startup类添加一下代码。

actionattribute是你拦截器的类名
            //全局拦截
            services.addmvc(options =>
            {
                options.filters.add(typeof(actionattribute));
            }).setcompatibilityversion(compatibilityversion.version_2_2);

部分控制器不进行拦截

当我们使用了全局拦截器之后,但是有的方法或者控制器我不想进行拦截器的话,我们可以编写一个空的拦截器不使用全局拦截器。

    /// <summary>
    /// 不需要登陆的地方加个这个空的拦截器
    /// </summary>
    public class nosignattribute : actionfilterattribute { }

然后在方法或者控制器上面添加一下代码

nosignattribute本来拦截器名称是这样的,我们可以忽略后面的默认名命nosign
        /// <summary>
        /// 不需要登录使用这个[nosign] 拦截器
        /// </summary>
        /// <returns></returns>
        [nosign]
        public iactionresult privacy()
        {
            return view();
        }

然后我们在全局的拦截器里面在加上一段判断的代码,其实这个就是加上的两个拦截器,只是一个没有用,判断当前的请求方法或者控制上面有没有这个空的拦截器,如果有说明我们这个方法或者控制器不需要被拦截。直接返回出去。

        /// <summary>
        /// 在控制器执行之前调用
        /// </summary>
        /// <param name="context">执行的上下文</param>
        public override void onactionexecuting(actionexecutingcontext context)
        {
            // 判断是否加上了不需要拦截
            var noneedcheck = false;
            if (context.actiondescriptor is controlleractiondescriptor controlleractiondescriptor)
            {
                noneedcheck = controlleractiondescriptor.methodinfo.getcustomattributes(inherit: true)
                  .any(a => a.gettype().equals(typeof(nosignattribute)));
            }
            if (noneedcheck) return;

            context.httpcontext.response.writeasync("在控制器执行之前调用");
        }

局部拦截

如果说你只想拦截某个控制器或者某个方法的时候,你可以在方法或者控制器上面添加拦截器的注释。

actionattribute本来拦截器名称是这样的,我们可以忽略后面的默认名命action

        /// <summary>
        /// 局部的使用拦截器
        /// </summary>
        /// <returns></returns>
        [action]
        public iactionresult index()
        {
            return view();
        }

当然如果你不想使用拦截器,喜欢用中间件也可以,在管道请求的管道中直接进行拦截,这也是可以的。

 如果有错误的地方,请帮我纠正。哈哈一起加油陌生人!!