本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
前言:什麼是操作篩選器
操作篩選器是 ASP.NET Core Web API 中的一種過濾器,用於在執行控制器操作(Action)之前或之後執行一些代碼,完成特定的功能,比如執行日誌記錄、身份驗證、授權、異常處理等通用的處理邏輯。
每次 ASP.NET Core Web API 中控制器的操作方法被執行的時候,操作篩選器都會被執行,所以操作篩選器預設是應用於所有控制器的操作方法的。
一個項目中可以註冊多個操作篩選器,這些操作篩選器組成一個鏈,上一個篩選器執行完了再執行下一個。next
就是一個用來指向下一個操作篩選器的委托,如果當前的操作篩選器是最後一個篩選器的話,next
就會執行要執行的操作方法。
操作篩選器跟前文(見《如何在 ASP.NET Core Web API 方法執行前後 “偷偷“ 作一些 “壞“ 事?初識 ActionFilterAttribute》)講過的 ActionFilterAttribute 比較相似,ActionFilterAttribute 是用於將操作篩選器邏輯應用於控制器操作的一種方式,而操作篩選器是一種更廣泛的概念,可以說,ActionFilterAttribute 是操作篩選器的一種特定實現方式,它通過特性的方式將操作篩選器邏輯應用於控制器操作。
Step By Step 步驟
-
創建一個 ASP.NET Core Web API 項目
-
編寫兩個自定義的操作篩選器 MyActionFilter1 和 MyActionFilter2,實現 IAsyncActionFilter 介面(註意看代碼中的註釋)
using Microsoft.AspNetCore.Mvc.Filters; public class MyActionFilter1 : IAsyncActionFilter { // context 參數代表 Action 執行的上下文對象,從 context 中我們可以獲取請求的路徑、參數值等信息 // next 參數代表下一個要執行的操作篩選器 public async Task OnActionExecutionAsync( ActionExecutingContext context, ActionExecutionDelegate next) { // next 之前的代碼是在操作方法執行之前要執行的代碼 Console.WriteLine("MyActionFilter 1:開始執行"); // 用 next 來執行下一個操作篩選器, // 如果這是最後一個操作篩選器,它就會執行實際的操作方法 // next 的返回值是操作方法的執行結果,返回值是 ActionExecutedContext 類型的。 // 如果操作方法執行的時候出現了未處理異常, // 那麼 ActionExecutedContext 的 Exception 屬性就是異常對象, // ActionExecutedContext 的 Result 屬性就是操作方法的執行結果。 ActionExecutedContext r = await next(); // 以下代碼則是在操作方法執行之後要執行的代碼 if (r.Exception != null) { Console.WriteLine("MyActionFilter 1:執行失敗"); } else { Console.WriteLine("MyActionFilter 1:執行成功"); } } } public class MyActionFilter2 : IAsyncActionFilter { public async Task OnActionExecutionAsync( ActionExecutingContext context, ActionExecutionDelegate next) { Console.WriteLine("MyActionFilter 2:開始執行"); ActionExecutedContext r = await next(); if (r.Exception != null) { Console.WriteLine("MyActionFilter 2:執行失敗"); } else { Console.WriteLine("MyActionFilter 2:執行成功"); } } }
-
打開 Program.cs,註冊這兩個操作篩選器
using Microsoft.AspNetCore.Mvc; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); // 註冊操作篩選器服務 builder.Services.Configure<MvcOptions>(options => { options.Filters.Add<MyActionFilter1>(); options.Filters.Add<MyActionFilter2>(); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
-
打開控制器,增加一個用於測試的操作方法
using Microsoft.AspNetCore.Mvc; namespace 操作篩選器.Controllers { [ApiController] [Route("[controller]/[action]")] public class TestController : ControllerBase { [HttpGet] public string GetData() { Console.WriteLine("執行GetData"); return "yzk"; } } }
測試運行和結果
執行順序:
MyActionFilter 1:開始執行
MyActionFilter 2:開始執行
執行GetData
MyActionFilter 2:執行成功
MyActionFilter 1:執行成功
我是老楊,一個執著於編程樂趣、至今奮鬥在一線的 10年+ 資深研發老鳥,是軟體項目管理師,也是快樂的程式猿,持續免費分享全棧實用編程技巧、項目管理經驗和職場成長心得!歡迎關註老楊的公眾號(名稱:代碼掌控者),和你共同探索代碼世界的奧秘!