架构增加文件存储服务的支持
This commit is contained in:
@@ -2,34 +2,49 @@
|
||||
|
||||
namespace SHH.CameraSdk;
|
||||
|
||||
/// <summary>
|
||||
/// 全局用户操作过滤器
|
||||
/// 作用:拦截所有 API 请求,记录关键操作(如新增、删除、修改设备)
|
||||
/// 优化:使用依赖注入 (DI) 获取存储服务,避免直接文件 IO 导致的锁冲突
|
||||
/// </summary>
|
||||
public class UserActionFilter : IActionFilter
|
||||
{
|
||||
// 静态锁,防止多线程同时写文件报错
|
||||
private static readonly object _logLock = new object();
|
||||
private readonly IStorageService _storage;
|
||||
|
||||
// 【关键点】构造函数注入
|
||||
// ASP.NET Core 会自动把我们在 Program.cs 中注册的 IStorageService 实例传进来
|
||||
public UserActionFilter(IStorageService storage)
|
||||
{
|
||||
_storage = storage;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Action 执行【后】触发
|
||||
/// </summary>
|
||||
public void OnActionExecuted(ActionExecutedContext context)
|
||||
{
|
||||
// 只记录非 GET 请求(即修改性质的操作)
|
||||
if (context.HttpContext.Request.Method != "GET")
|
||||
// 1. 获取请求的基本信息
|
||||
var method = context.HttpContext.Request.Method;
|
||||
var path = context.HttpContext.Request.Path;
|
||||
|
||||
// 2. 过滤逻辑:为了防止日志爆炸,我们通常只记录非 GET 请求
|
||||
// (例如:只记录 POST/PUT/DELETE 等修改性操作)
|
||||
if (method != "GET")
|
||||
{
|
||||
try
|
||||
{
|
||||
var user = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "Unknown";
|
||||
var path = context.HttpContext.Request.Path;
|
||||
var method = context.HttpContext.Request.Method;
|
||||
var time = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
|
||||
var ip = context.HttpContext.Connection.RemoteIpAddress?.ToString() ?? "Unknown";
|
||||
|
||||
var logLine = $"{time} | IP: {user} | {method} {path}";
|
||||
|
||||
lock (_logLock)
|
||||
{
|
||||
// 追加写入到运行目录下的 user_actions.log
|
||||
File.AppendAllText("user_actions.log", logLine + Environment.NewLine);
|
||||
}
|
||||
}
|
||||
catch { /* 忽略日志写入错误,不要影响业务 */ }
|
||||
// 3. 调用存储服务写入日志
|
||||
// 注意:这里我们不等待任务完成 (Fire-and-Forget),以免日志写入拖慢 API 响应速度
|
||||
// 因为 _storage.AppendSystemLogAsync 内部目前是空实现(Task.CompletedTask),所以这里绝对不会卡顿
|
||||
_ = _storage.AppendSystemLogAsync(method, ip, path);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnActionExecuting(ActionExecutingContext context) { }
|
||||
/// <summary>
|
||||
/// Action 执行【前】触发 (此处不需要处理)
|
||||
/// </summary>
|
||||
public void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user