.net core 攔截器的使用


.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 是請求進來的 上下文。

 

這個是里面的一些屬性,你可以進行相對應的使用。、

異常攔截器的使用

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

當然如果你不想使用攔截器,喜歡用中間件也可以,在管道請求的管道中直接進行攔截,這也是可以的。

 如果有錯誤的地方,請幫我糾正。哈哈一起加油陌生人!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM