using Microsoft.AspNetCore.Mvc.Filters; namespace SHH.CameraSdk; /// /// 全局用户操作过滤器 /// 作用:拦截所有 API 请求,记录关键操作(如新增、删除、修改设备) /// 优化:使用依赖注入 (DI) 获取存储服务,避免直接文件 IO 导致的锁冲突 /// public class UserActionFilter : IActionFilter { private readonly IStorageService _storage; // 【关键点】构造函数注入 // ASP.NET Core 会自动把我们在 Program.cs 中注册的 IStorageService 实例传进来 public UserActionFilter(IStorageService storage) { _storage = storage; } /// /// Action 执行【后】触发 /// public void OnActionExecuted(ActionExecutedContext context) { // 1. 获取请求的基本信息 var method = context.HttpContext.Request.Method; var path = context.HttpContext.Request.Path; // 2. 过滤逻辑:为了防止日志爆炸,我们通常只记录非 GET 请求 // (例如:只记录 POST/PUT/DELETE 等修改性操作) if (method != "GET") { var ip = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "Unknown"; // 3. 调用存储服务写入日志 // 注意:这里我们不等待任务完成 (Fire-and-Forget),以免日志写入拖慢 API 响应速度 // 因为 _storage.AppendSystemLogAsync 内部目前是空实现(Task.CompletedTask),所以这里绝对不会卡顿 _ = _storage.AppendSystemLogAsync(method, ip, path); } } /// /// Action 执行【前】触发 (此处不需要处理) /// public void OnActionExecuting(ActionExecutingContext context) { // Do nothing } }