.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(); }
當然如果你不想使用攔截器,喜歡用中間件也可以,在管道請求的管道中直接進行攔截,這也是可以的,
如果有錯誤的地方,請幫我糾正,哈哈一起加油陌生人!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/107338.html
標籤:.NET Core
上一篇:ABP進階教程7 - 功能按鈕
下一篇:.net Core資料的幕等性
