From 1d90aba7cd5de28ea27e8c1b72f874f64ae8a7dd Mon Sep 17 00:00:00 2001 From: he <109787524@qq.com> Date: Tue, 30 Jun 2026 14:04:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=87=8D=E5=A4=8D=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RequestDuplicationFilter.cs | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs index a64d098bd..d462948dd 100644 --- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs +++ b/IRaCIS.Core.Application/BusinessFilter/LegacyController/RequestDuplicationFilter.cs @@ -8,6 +8,7 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController { using Database.Api; using DocumentFormat.OpenXml.InkML; + using IRaCIS.Core.Application.Helper.OtherTool; using IRaCIS.Core.Application.Service.Common; using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure.Extention; @@ -17,6 +18,7 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.ModelBinding; + using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -35,7 +37,7 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController /// /// logger /// loggerHelper - public class RequestDuplicationFilter(ILogger logger, IHttpContextAccessor accessor, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor RequestDuplicationOptionsMonitor) : ExceptionFilterAttribute, IAsyncActionFilter + public class RequestDuplicationFilter(ILogger logger, IHttpContextAccessor accessor, IUserInfo _userInfo, IStringLocalizer _localizer, IOptionsMonitor RequestDuplicationOptionsMonitor, IConfiguration _config) : ExceptionFilterAttribute, IAsyncActionFilter { /// /// 传入的参数 @@ -118,11 +120,51 @@ namespace IRaCIS.Core.Application.BusinessFilter.LegacyController RequestDuplicationOptionsMonitor.CurrentValue.DuplicationWindowMs); if (!isAdded) { + SendRequestDuplicationWeComNotice(requestPath); + logger.LogError($"重复请求出现错误:{this.Intoparam}"); throw new BusinessValidationFailedException(_localizer["RequestDuplicationFilter_RequestDuplication"], ApiResponseCodeEnum.BusinessValidationFailed); } } } + private void SendRequestDuplicationWeComNotice(string requestPath) + { + try + { + bool isOpenWeComNotice = _config.GetValue("WeComNoticeConfig:IsOpenWeComNotice"); + + if (isOpenWeComNotice) + { + string webhook = _config["WeComNoticeConfig:WebhookUrl"] ?? string.Empty; + + var uri = new Uri(_config["SystemEmailSendConfig:SiteUrl"]); + var baseUrl = uri.GetLeftPart(UriPartial.Authority); + + var userList = _config.GetSection("WeComNoticeConfig:APINoticeUserList").Get(); + + var request = accessor?.HttpContext?.Request; + + _ = WeComNotifier.SendAlertAsync( + webhook: webhook, + alert: new WeComAlert + { + Env = baseUrl, + UserName = _userInfo.UserName.IsNotNullOrEmpty() ? $"{_userInfo.UserName}({_userInfo.UserTypeShortName})" : "匿名", + Api = $"{request?.Method} {requestPath}", + Message = "重复请求拦截", + JsonData = this.Intoparam, + Stack = string.Empty, + AtUsers = userList ?? [] + } + ); + } + } + catch (Exception ex) + { + logger.LogError($"重复请求过滤器里发送企业微信出现错误:{ex.Message}"); + } + } + public string GenerateParameterHash(string parameters) { if (string.IsNullOrEmpty(parameters))