過濾器:

using Fengling.Activity.App.Request.Member; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using Siia; using System; namespace Fengling.Activity.Web.Extensions { public class PreventSpamAttribute : ActionFilterAttribute { //處理請求之間的延遲 public int DelayRequest = 10; //防止多次請求時的錯誤提示信息 public string ErrorMessage = "Excessive Request Attempts Detected."; IMemoryCache cache = new MemoryCache(Options.Create(new MemoryCacheOptions())); /// <summary> /// 控制器中加了該屬性的方法中代碼執行之前該方法。 /// 所以可以用做權限校驗。 /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { //循環獲取在Controller的Action方法中定義的參數 foreach (var parameter in context.ActionDescriptor.Parameters) { var parameterName = parameter.Name;//獲取Action方法中參數的名字 var parameterType = parameter.ParameterType;//獲取Action方法中參數的類型 //判斷該Controller的Action方法是否有類型為LoginLogoutRequest的參數 if (parameterType == typeof(MemberIntegralRequest)) { //如果有,那么就獲取LoginLogoutRequest類型參數的值 var pointRequest = context.ActionArguments[parameterName] as MemberIntegralRequest; if (cache.TryGetValue(pointRequest.IntegralCode, out _)) { ErrorMessage = "網絡擁擠,請稍后重試"; context.Result = new JsonResult(ActionResponse.Fail(-1, ErrorMessage)); } else { // 緩存保存10s cache.Set(pointRequest.IntegralCode, pointRequest, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromSeconds(DelayRequest))); } } } base.OnActionExecuting(context); } } }
控制器調用: