专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

.net core 拦截器的使用

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:51:41       共计:3644 浏览

实例代码: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 是请求进来的 上下文。




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


异常拦截器的使用


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();

       }


复制代码


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


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

我曾七次鄙视自己的灵魂:

第一次,当它本可进取时,却故作谦卑;

第二次,当它空虚时,用爱欲来填充;

第三次,在困难和容易之间,它选择了容易;

第四次,它犯了错,却借由别人也会犯错来宽慰自己;

第五次,它自由软弱,却把它认为是生命的坚韧;

第六次,当它鄙夷一张丑恶的嘴脸时,却不知那正是自己面具中的一副;

第七次,它侧身于生活的污泥中虽不甘心,却又畏首畏尾。


版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C#非托管资源释放(Finalize&Dispose)方法 | ·下一条:Asp.Net 拦截请求自定义处理

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有